AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Unit Class Referenceabstract

#include "Unit.h"

Inheritance diagram for Unit:
WorldObject Object WorldLocation Position Creature Player TempSummon Minion Guardian Puppet Totem Pet

Public Types

typedef std::unordered_set< Unit * > AttackerSet
 
typedef std::set< Unit * > ControlSet
 
typedef std::multimap< uint32, Aura * > AuraMap
 
typedef std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
 
typedef std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
 
typedef std::multimap< uint32, AuraApplication * > AuraApplicationMap
 
typedef std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
 
typedef std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
 
typedef std::multimap< AuraStateType, AuraApplication * > AuraStateAurasMap
 
typedef std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
 
typedef std::list< AuraEffect * > AuraEffectList
 
typedef std::list< Aura * > AuraList
 
typedef std::list< AuraApplication * > AuraApplicationList
 
typedef std::list< DiminishingReturnDiminishing
 
typedef GuidUnorderedSet ComboPointHolderSet
 
typedef std::map< uint8, AuraApplication * > VisibleAuraMap
 
typedef std::set< PetAura const * > PetAuraSet
 

Public Member Functions

 ~Unit () override
 
void Update (uint32 time) override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
void SetUInt32Value (uint16 index, uint32 value)
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h. More...
 
void RemoveUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h. More...
 
void ReplaceAllUnitFlags (UnitFlags flags)
 Remove the Unit flag specify only. More...
 
UnitFlags2 GetUnitFlags2 () const
 Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h. More...
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
NPCFlags GetNpcFlags () const
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
bool IsVendor () const
 
bool IsTrainer () const
 
bool IsQuestGiver () const
 
bool IsGossip () const
 
bool IsTaxi () const
 
bool IsGuildMaster () const
 
bool IsBattleMaster () const
 
bool IsBanker () const
 
bool IsInnkeeper () const
 
bool IsSpiritHealer () const
 
bool IsSpiritGuide () const
 
bool IsTabardDesigner () const
 
bool IsAuctioner () const
 
bool IsArmorer () const
 
bool IsServiceProvider () const
 
bool IsSpiritService () const
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
uint8 getClass () const
 
virtual bool IsClass (Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
uint32 GetFaction () const
 
void SetFaction (uint32 faction)
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) const
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
float GetCombatReach () const override
 
float GetMeleeReach () const
 
bool IsWithinRange (Unit const *obj, float dist) const
 
bool IsWithinCombatRange (Unit const *obj, float dist2compare) const
 
bool IsWithinMeleeRange (Unit const *obj, float dist=0.f) const
 
float GetMeleeRange (Unit const *target) const
 
virtual SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
 
bool GetRandomContactPoint (Unit const *target, float &x, float &y, float &z, bool force=false) const
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 Interrupt the unit cast for all the current spells. More...
 
bool AttackStop ()
 Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client. More...
 
void RemoveAllAttackers ()
 Remove all units in m_attackers list and send them AttackStop() More...
 
AttackerSet const & getAttackers () const
 
bool GetMeleeAttackPoint (Unit *attacker, Position &pos)
 
bool isAttackingPlayer () const
 
UnitGetVictim () const
 
void CombatStop (bool includingCast=false)
 
void CombatStopWithPets (bool includingCast=false)
 
void StopAttackFaction (uint32 faction_id)
 
void StopAttackingInvalidTarget ()
 
UnitSelectNearbyTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
UnitSelectNearbyNoTotemTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
void SendMeleeAttackStop (Unit *victim=nullptr)
 Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead. More...
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
uint32 GetAttackTime (WeaponAttackType att) const
 
void SetAttackTime (WeaponAttackType att, uint32 val)
 
void ApplyAttackTimePercentMod (WeaponAttackType att, float val, bool apply)
 
void ApplyCastTimePercentMod (float val, bool apply)
 
void SetImmuneToAll (bool apply, bool keepCombat=false)
 
bool IsImmuneToAll () const
 
void SetImmuneToPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToPC () const
 
void SetImmuneToNPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToNPC () const
 
bool IsEngaged () const
 
bool IsEngagedBy (Unit const *who) const
 
bool IsInCombat () const
 
bool IsInCombatWith (Unit const *who) const
 
bool IsPetInCombat () const
 
void CombatStart (Unit *target, bool initialAggro=true)
 
void CombatStartOnCast (Unit *target, bool initialAggro=true, uint32 duration=0)
 
void SetInCombatState (bool PvP, Unit *enemy=nullptr, uint32 duration=0)
 
void SetInCombatWith (Unit *enemy, uint32 duration=0)
 
void ClearInCombat ()
 
void ClearInPetCombat ()
 
uint32 GetCombatTimer () const
 
void SetCombatTimer (uint32 timer)
 
bool CanHaveThreatList (bool skipAliveCheck=false) const
 
void AddThreat (Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
 
float ApplyTotalThreatModifier (float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
void TauntApply (Unit *victim)
 
void TauntFadeOut (Unit *taunter)
 
ThreatMgrGetThreatMgr ()
 
ThreatMgr const & GetThreatMgr () const
 
void addHatedBy (HostileReference *pHostileReference)
 
void removeHatedBy (HostileReference *)
 
HostileRefMgrgetHostileRefMgr ()
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
uint32 GetResistance (SpellSchools school) const
 
uint32 GetResistance (SpellSchoolMask mask) const
 
void SetResistance (SpellSchools school, int32 val)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
bool IsFullHealth () const
 
bool HealthBelowPct (int32 pct) const
 
bool HealthBelowPctDamaged (int32 pct, uint32 damage) const
 
bool HealthAbovePct (int32 pct) const
 
bool HealthAbovePctHealed (int32 pct, uint32 heal) const
 
float GetHealthPct () const
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
float GetPowerPct (Powers power) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
int32 GetHealthGain (int32 dVal)
 
Powers getPowerType () const
 
void setPowerType (Powers power)
 
virtual bool HasActivePowerType (Powers power)
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
void SetPower (Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
 
void SetMaxPower (Powers power, uint32 val)
 
int32 ModifyPower (Powers power, int32 val, bool withPowerUpdate=true)
 
int32 ModifyPowerPct (Powers power, float pct, bool apply=true)
 
bool HandleStatModifier (UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
 
void SetModifierValue (UnitMods unitMod, UnitModifierType modifierType, float value)
 
float GetModifierValue (UnitMods unitMod, UnitModifierType modifierType) const
 
float GetTotalStatValue (Stats stat, float additionalValue=0.0f) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
bool CanModifyStats () const
 
void SetCanModifyStats (bool modifyStats)
 
virtual bool UpdateStats (Stats stat)=0
 
virtual bool UpdateAllStats ()=0
 
virtual void UpdateResistances (uint32 school)=0
 
virtual void UpdateAllResistances ()
 
virtual void UpdateArmor ()=0
 
virtual void UpdateMaxHealth ()=0
 
virtual void UpdateMaxPower (Powers power)=0
 
virtual void UpdateAttackPowerAndDamage (bool ranged=false)=0
 
virtual void UpdateDamagePhysical (WeaponAttackType attType)
 
float GetTotalAttackPowerValue (WeaponAttackType attType, Unit *pVictim=nullptr) const
 
float GetWeaponDamageRange (WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
 
void SetBaseWeaponDamage (WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
 
virtual void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
DiminishingLevels GetDiminishing (DiminishingGroup group)
 
void IncrDiminishing (DiminishingGroup group)
 
float ApplyDiminishingToDuration (DiminishingGroup group, int32 &duration, Unit *caster, DiminishingLevels Level, int32 limitduration)
 
void ApplyDiminishingAura (DiminishingGroup group, bool apply)
 
void ClearDiminishings ()
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
bool CanFreeMove () const
 
SheathState GetSheath () const
 
virtual void SetSheath (SheathState sheathed)
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
bool IsContestedGuard () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
void ProcDamageAndSpellFor (bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
void GetProcAurasTriggeredOnEvent (std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
 
void TriggerAurasProcOnEvent (CalcDamageInfo &damageInfo)
 
void TriggerAurasProcOnEvent (std::list< AuraApplication * > *myProcAuras, std::list< AuraApplication * > *targetProcAuras, Unit *actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
 
void TriggerAurasProcOnEvent (ProcEventInfo &eventInfo, std::list< AuraApplication * > &procAuras)
 
void HandleEmoteCommand (uint32 emoteId)
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float MeleeSpellMissChance (Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
 
SpellMissInfo MeleeSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo MagicSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo SpellHitResult (Unit *victim, SpellInfo const *spell, bool canReflect=false)
 
SpellMissInfo SpellHitResult (Unit *victim, Spell const *spell, bool canReflect=false)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) const
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
virtual bool HasWeapon (WeaponAttackType type) const =0
 
bool HasMainhandWeapon () const
 
bool HasOffhandWeapon () const
 
bool HasRangedWeapon () const
 
bool hasMainhandWeaponForAttack () const
 
virtual bool HasWeaponForAttack (WeaponAttackType type) const
 
bool HasMainhandWeaponForAttack () const
 
bool HasOffhandWeaponForAttack () const
 
bool HasRangedWeaponForAttack () const
 
bool CanUseAttackType (uint8 attacktype) const
 
virtual uint32 GetShieldBlockValue () const =0
 
uint32 GetShieldBlockValue (uint32 soft_cap, uint32 hard_cap) const
 
uint32 GetUnitMeleeSkill (Unit const *target=nullptr) const
 
uint32 GetDefenseSkillValue (Unit const *target=nullptr) const
 
uint32 GetWeaponSkillValue (WeaponAttackType attType, Unit const *target=nullptr) const
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
 
bool IsCritter () const
 
bool IsInFlight () const
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
virtual bool HasSpell (uint32) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) const
 
bool HasStealthAura () const
 
bool HasInvisibilityAura () const
 
bool isFeared () const
 
bool isInRoots () const
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool isTargetableForAttack (bool checkFakeDeath=true, Unit const *byWho=nullptr) const
 
bool IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell=nullptr) const
 
bool _IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
 
bool IsValidAssistTarget (Unit const *target) const
 
bool _IsValidAssistTarget (Unit const *target, SpellInfo const *bySpell) const
 
virtual bool IsInWater () const
 
virtual bool IsUnderWater () const
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
SpellCastResult CastSpell (SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (float x, float y, float z, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (GameObject *go, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
void DeMorph ()
 
void SendAttackStateUpdate (CalcDamageInfo *damageInfo)
 
void SendAttackStateUpdate (uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
 
void SendSpellNonMeleeDamageLog (SpellNonMeleeDamage *log)
 
void SendSpellNonMeleeReflectLog (SpellNonMeleeDamage *log, Unit *attacker)
 
void SendSpellNonMeleeDamageLog (Unit *target, SpellInfo const *spellInfo, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit=false, bool Split=false)
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
void SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void NearTeleportTo (Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void NearTeleportTo (float x, float y, float z, float orientation, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
virtual bool UpdatePosition (float x, float y, float z, float ang, bool teleport=false)
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void UpdateOrientation (float orientation)
 Only server-side orientation update, does not broadcast to client. More...
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client. More...
 
void KnockbackFrom (float x, float y, float speedXY, float speedZ)
 
void JumpTo (float speedXY, float speedZ, bool forward=true)
 
void JumpTo (WorldObject *obj, float speedZ)
 
void SendMonsterMove (float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf=SPLINEFLAG_WALK_MODE)
 
void MonsterMoveWithSpeed (float x, float y, float z, float speed)
 
void SendMovementFlagUpdate (bool self=false)
 
virtual bool SetWalk (bool enable)
 
virtual bool SetDisableGravity (bool disable, bool packetOnly=false, bool updateAnimationTier=true)
 
virtual bool SetSwim (bool enable)
 
virtual bool SetCanFly (bool enable, bool packetOnly=false)
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity(). More...
 
virtual bool SetWaterWalking (bool enable, bool packetOnly=false)
 Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players. More...
 
virtual bool SetFeatherFall (bool enable, bool packetOnly=false)
 
virtual bool SetHover (bool enable, bool packetOnly=false, bool updateAnimationTier=true)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
DeathState getDeathState ()
 
virtual void setDeathState (DeathState s, bool despawn=false)
 
ObjectGuid GetOwnerGUID () const
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetCreatorGUID () const
 
void SetCreatorGUID (ObjectGuid creator)
 
ObjectGuid GetMinionGUID () const
 
void SetMinionGUID (ObjectGuid guid)
 
ObjectGuid GetCharmerGUID () const
 
void SetCharmerGUID (ObjectGuid owner)
 
ObjectGuid GetCharmGUID () const
 
void SetPetGUID (ObjectGuid guid)
 
ObjectGuid GetPetGUID () const
 
void SetCritterGUID (ObjectGuid guid)
 
ObjectGuid GetCritterGUID () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
PlayerGetSpellModOwner () const
 
UnitGetOwner () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
PlayerGetAffectingPlayer () const
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void SetCharm (Unit *target, bool apply)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void RemoveCharmedBy (Unit *charmer)
 
void RestoreFaction ()
 
UnitGetFirstControlled () const
 
void RemoveAllControlled (bool onDeath=false)
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
void DeleteCharmInfo ()
 
void UpdateCharmAI ()
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
void RemoveBindSightAuras ()
 
void RemoveCharmAuras ()
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
Aura_TryStackingOrRefreshingExistingAura (SpellInfo const *newAura, uint8 effMask, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool periodicReset=false)
 
void _AddAura (UnitAura *aura, Unit *caster)
 
AuraApplication_CreateAuraApplication (Aura *aura, uint8 effMask)
 
void _ApplyAuraEffect (Aura *aura, uint8 effIndex)
 
void _ApplyAura (AuraApplication *aurApp, uint8 effMask)
 
void _UnapplyAura (AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
 
void _UnapplyAura (AuraApplication *aurApp, AuraRemoveMode removeMode)
 
void _RemoveNoStackAuraApplicationsDueToAura (Aura *aura)
 
void _RemoveNoStackAurasDueToAura (Aura *aura)
 
bool _IsNoStackAuraDueToAura (Aura *appliedAura, Aura *existingAura) const
 
void _RegisterAuraEffect (AuraEffect *aurEff, bool apply)
 
AuraMapGetOwnedAuras ()
 
AuraMap const & GetOwnedAuras () const
 
void RemoveOwnedAura (AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (Aura *aura, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
AuraGetOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
 
AuraApplicationMapGetAppliedAuras ()
 
AuraApplicationMap const & GetAppliedAuras () const
 
void RemoveAura (AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (AuraApplication *aurApp, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (Aura *aur, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAppliedAuras (std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (std::function< bool(Aura const *)> const &check)
 
void RemoveAppliedAuras (uint32 spellId, std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (uint32 spellId, std::function< bool(Aura const *)> const &check)
 
void RemoveAurasDueToSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAuraFromStack (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAurasDueToSpellByDispel (uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit *dispeller, uint8 chargesRemoved=1)
 
void RemoveAurasDueToSpellBySteal (uint32 spellId, ObjectGuid casterGUID, Unit *stealer)
 
void RemoveAurasDueToItemSpell (uint32 spellId, ObjectGuid castItemGuid)
 
void RemoveAurasByType (AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
 
void RemoveNotOwnSingleTargetAuras ()
 
void RemoveAurasWithInterruptFlags (uint32 flag, uint32 except=0, bool isAutoshot=false)
 
void RemoveAurasWithAttribute (uint32 flags)
 
void RemoveAurasWithFamily (SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID)
 
void RemoveAurasWithMechanic (uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
 
void RemoveMovementImpairingAuras (bool withRoot)
 
void RemoveAurasByShapeShift ()
 
void RemoveAreaAurasDueToLeaveWorld ()
 
void RemoveAllAuras ()
 
void RemoveArenaAuras ()
 
void RemoveAllAurasOnDeath ()
 
void RemoveAllAurasRequiringDeadTarget ()
 
void RemoveAllAurasExceptType (AuraType type)
 
void RemoveEvadeAuras ()
 
void DelayOwnedAuras (uint32 spellId, ObjectGuid caster, int32 delaytime)
 
void _RemoveAllAuraStatMods ()
 
void _ApplyAllAuraStatMods ()
 
AuraEffectList const & GetAuraEffectsByType (AuraType type) const
 
AuraListGetSingleCastAuras ()
 
AuraList const & GetSingleCastAuras () const
 
AuraEffectGetAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectOfRankedSpell (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectDummy (uint32 spellid) const
 
AuraEffectGetDummyAuraEffect (SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraApplicationGetAuraApplication (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
AuraApplicationGetAuraApplicationOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAuraOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
void GetDispellableAuraList (Unit *caster, uint32 dispelMask, DispelChargesList &dispelList, SpellInfo const *dispelSpell)
 
bool HasAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
 
uint32 GetAuraCount (uint32 spellId) const
 
bool HasAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
bool HasAuraType (AuraType auraType) const
 
bool HasAuraTypeWithCaster (AuraType auratype, ObjectGuid caster) const
 
bool HasAuraTypeWithMiscvalue (AuraType auratype, int32 miscvalue) const
 
bool HasAuraTypeWithAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
bool HasAuraTypeWithValue (AuraType auratype, int32 value) const
 
bool HasAuraTypeWithTriggerSpell (AuraType auratype, uint32 triggerSpell) const
 
bool HasNegativeAuraWithInterruptFlag (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasVisibleAuraType (AuraType auraType) const
 
bool HasNegativeAuraWithAttribute (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasAuraWithMechanic (uint32 mechanicMask) const
 
AuraEffectIsScriptOverriden (SpellInfo const *spell, int32 script) const
 
uint32 GetDiseasesByCaster (ObjectGuid casterGUID, uint8 mode=0)
 
uint32 GetDoTsByCaster (ObjectGuid casterGUID) const
 
int32 GetTotalAuraModifierAreaExclusive (AuraType auratype) const
 
int32 GetTotalAuraModifier (AuraType auratype) const
 
float GetTotalAuraMultiplier (AuraType auratype) const
 
int32 GetMaxPositiveAuraModifier (AuraType auratype)
 
int32 GetMaxNegativeAuraModifier (AuraType auratype) const
 
int32 GetTotalAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
float GetTotalAuraMultiplierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetMaxPositiveAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
 
int32 GetMaxNegativeAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetTotalAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
float GetTotalAuraMultiplierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxPositiveAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxNegativeAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetTotalAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetTotalAuraMultiplierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxPositiveAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxNegativeAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetResistanceBuffMods (SpellSchools school, bool positive) const
 
void SetResistanceBuffMods (SpellSchools school, bool positive, float val)
 
void ApplyResistanceBuffModsMod (SpellSchools school, bool positive, float val, bool apply)
 
void ApplyResistanceBuffModsPercentMod (SpellSchools school, bool positive, float val, bool apply)
 
void InitStatBuffMods ()
 
void ApplyStatBuffMod (Stats stat, float val, bool apply)
 
void ApplyStatPercentBuffMod (Stats stat, float val, bool apply)
 
void SetCreateStat (Stats stat, float val)
 
void SetCreateHealth (uint32 val)
 
uint32 GetCreateHealth () const
 
void SetCreateMana (uint32 val)
 
uint32 GetCreateMana () const
 
uint32 GetCreatePowers (Powers power) const
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
float GetCreateStat (Stats stat) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
virtual void ProhibitSpellSchool (SpellSchoolMask, uint32)
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
bool IsNonMeleeSpellCast (bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
 
void InterruptNonMeleeSpells (bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
virtual bool IsMovementPreventedByCasting () const
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsAttackSpeedOverridenShapeShift () const
 
bool IsInFeralForm () const
 
bool IsInDisallowedMountForm () const
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool IsVisible () const
 
void SetVisible (bool x)
 
void SetModelVisible (bool on)
 
uint32 GetPhaseByAuras () const
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId, float displayScale=1.f)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 displayId)
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void _RegisterDynObject (DynamicObject *dynObj)
 
void _UnregisterDynObject (DynamicObject *dynObj)
 
DynamicObjectGetDynObject (uint32 spellId)
 
bool RemoveDynObject (uint32 spellId)
 
void RemoveAllDynObjects ()
 
GameObjectGetGameObject (uint32 spellId) const
 
void AddGameObject (GameObject *gameObj)
 
void RemoveGameObject (GameObject *gameObj, bool del)
 
void RemoveGameObject (uint32 spellid, bool del)
 
void RemoveAllGameObjects ()
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
void UnsummonAllTotems (bool onDeath=false)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
int32 SpellBaseDamageBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseDamageBonusTaken (SpellSchoolMask schoolMask, bool isDoT=false)
 
float SpellPctDamageModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellDamageBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellDamageBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
 
int32 SpellBaseHealingBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseHealingBonusTaken (SpellSchoolMask schoolMask)
 
float SpellPctHealingModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellHealingBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellHealingBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1)
 
uint32 MeleeDamageBonusDone (Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
uint32 MeleeDamageBonusTaken (Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
bool isBlockCritical ()
 
float SpellDoneCritChance (Unit const *, SpellInfo const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const
 
float SpellTakenCritChance (Unit const *caster, SpellInfo const *spellProto, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType, bool skipEffectCheck) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
void ApplySpellImmune (uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
 
void ApplySpellDispelImmunity (SpellInfo const *spellProto, DispelType type, bool apply)
 
virtual bool IsImmunedToSpell (SpellInfo const *spellInfo, Spell const *spell=nullptr)
 
bool IsImmunedToDamage (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamage (SpellInfo const *spellInfo) const
 
bool IsImmunedToDamage (Spell const *spell) const
 
bool IsImmunedToSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToSchool (SpellInfo const *spellInfo) const
 
bool IsImmunedToSchool (Spell const *spell) const
 
bool IsImmunedToDamageOrSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamageOrSchool (SpellInfo const *spellInfo) const
 
virtual bool IsImmunedToSpellEffect (SpellInfo const *spellInfo, uint32 index) const
 
void UpdateSpeed (UnitMoveType mtype, bool forced)
 
float GetSpeed (UnitMoveType mtype) const
 
float GetSpeedRate (UnitMoveType mtype) const
 
void SetSpeed (UnitMoveType mtype, float rate, bool forced=false)
 
void SetSpeedRate (UnitMoveType mtype, float rate)
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) const
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
int32 CalcSpellDuration (SpellInfo const *spellProto)
 
int32 ModSpellDuration (SpellInfo const *spellProto, Unit const *target, int32 duration, bool positive, uint32 effectMask)
 
void ModSpellCastTime (SpellInfo const *spellProto, int32 &castTime, Spell *spell=nullptr)
 
float CalculateLevelPenalty (SpellInfo const *spellProto) const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
MotionMasterGetMotionMaster ()
 
const MotionMasterGetMotionMaster () const
 
virtual MovementGeneratorType GetDefaultMovementType () const
 -------—End of Pet responses methods-------— More...
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline. More...
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void AddUnitMovementFlag (uint32 f)
 
void RemoveUnitMovementFlag (uint32 f)
 
bool HasUnitMovementFlag (uint32 f) const
 
uint32 GetUnitMovementFlags () const
 
void SetUnitMovementFlags (uint32 f)
 
void AddExtraUnitMovementFlag (uint16 f)
 
void RemoveExtraUnitMovementFlag (uint16 f)
 
uint16 HasExtraUnitMovementFlag (uint16 f) const
 
uint16 GetExtraUnitMovementFlags () const
 
void SetExtraUnitMovementFlags (uint16 f)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 --------—Combo point system----------------— More...
 
uint8 GetComboPoints (ObjectGuid const &guid) const
 
UnitGetComboTarget () const
 
ObjectGuid const GetComboTargetGUID () const
 
void AddComboPoints (Unit *target, int8 count)
 
void AddComboPoints (int8 count)
 
void ClearComboPoints ()
 
void SendComboPoints ()
 
void AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SendPetActionFeedback (uint8 msg)
 -------—Pet responses methods--------------— More...
 
void SendPetTalk (uint32 pettalk)
 
void SendPetAIReaction (ObjectGuid guid)
 
void propagateSpeedChange ()
 -------—End of Pet responses methods-------— More...
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
void UpdateAuraForGroup (uint8 slot)
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId) const
 
uint32 GetModelForTotem (PlayerTotemType totemType)
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
ObjectGuid GetTransGUID () const override
 
TransportBaseGetDirectTransport () const
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle) More...
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void EnterVehicle (Unit *base, int8 seatId=-1)
 
void EnterVehicleUnattackable (Unit *base, int8 seatId=-1)
 
void ExitVehicle (Position const *exitPosition=nullptr)
 
void ChangeSeat (int8 seatId, bool next=true)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void BuildMovementPacket (ByteBuffer *data) const
 
virtual bool CanSwim () const
 this method checks the current flag of a unit More...
 
bool IsLevitating () const
 
bool IsWalking () const
 
bool isMoving () const
 
bool isTurning () const
 
bool IsHovering () const
 
bool isSwimming () const
 
virtual bool CanFly () const =0
 
bool IsFlying () const
 
bool IsFalling () const
 
float GetHoverHeight () const
 
virtual bool CanEnterWater () const =0
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
virtual float GetFollowAngle () const
 
void OutDebugInfo () const
 
virtual bool isBeingLoaded () const
 
bool IsDuringRemoveFromWorld () const
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
virtual bool HasSpellCooldown (uint32) const
 
virtual bool HasSpellItemCooldown (uint32, uint32) const
 
virtual void AddSpellCooldown (uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
 
bool CanApplyResilience () const
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
int32 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, Unit *caster) const
 
ObjectGuid GetTarget () const
 
virtual void SetTarget (ObjectGuid=ObjectGuid::Empty)=0
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
virtual void Talk (std::string_view text, ChatMsg msgType, Language language, float textRange, WorldObject const *target)
 
virtual void Say (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void Yell (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void TextEmote (std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (std::string_view text, Language language, Player *target, bool isBossWhisper=false)
 
virtual void Talk (uint32 textId, ChatMsg msgType, float textRange, WorldObject const *target)
 
virtual void Say (uint32 textId, WorldObject const *target=nullptr)
 
virtual void Yell (uint32 textId, WorldObject const *target=nullptr)
 
virtual void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (uint32 textId, Player *target, bool isBossWhisper=false)
 
float GetCollisionHeight () const override
 Return collision height sent to client. More...
 
float GetCollisionWidth () const override
 this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC More...
 
float GetCollisionRadius () const override
 this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC More...
 
uint32 GetVirtualItemId (uint32 slot) const
 
void SetVirtualItem (uint32 slot, uint32 itemId)
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
virtual void ProcessTerrainStatusUpdate ()
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
std::string GetDebugInfo () const override
 
uint32 GetOldFactionId () const
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
virtual void Update (uint32)
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle, bool disableWarning=false)
 
Position GetNearPosition (float dist, float angle, bool disableWarning=false)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius, bool disableWarning=false)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
virtual float GetCombatReach () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (const Position &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (const Position &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
virtual void SetPhaseMask (uint32 newPhaseMask, bool update)
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
virtual std::string const & GetNameForLocaleIdx (LocaleConstant) const
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (const Position &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (const Position *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (const Position *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
virtual void CleanupsBeforeDelete (bool finalCleanup=true)
 
virtual void SendMessageToSet (WorldPacket const *data, bool self) const
 
virtual void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const
 
virtual void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const
 
virtual uint8 getLevelForTarget (WorldObject const *) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
virtual void SaveRespawnTime ()
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
virtual float GetSightRange (WorldObject const *target=nullptr) const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
virtual void SetMap (Map *map)
 
virtual void ResetMap ()
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
void DestroyForNearbyPlayers ()
 
virtual void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false)
 
void BuildUpdate (UpdateDataMapType &data_map, UpdatePlayerSet &player_set) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
bool IsFarVisible () const
 
bool IsVisibilityOverridden () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
void SetWorldObject (bool apply)
 
bool IsPermanentWorldObject () const
 
bool IsWorldObject () const
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
virtual ObjectGuid GetTransGUID () const
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim. More...
 
virtual float GetCollisionHeight () const
 
virtual float GetCollisionWidth () const
 
virtual float GetCollisionRadius () const
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
virtual void AddToWorld ()
 
virtual void RemoveFromWorld ()
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
virtual void SetObjectScale (float scale)
 
virtual uint32 GetDynamicFlags () const
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
virtual void ReplaceAllDynamicFlags (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
virtual void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
virtual void DestroyForPlayer (Player *target, bool onDeath=false) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void ApplyPercentModFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
virtual bool hasQuest (uint32) const
 
virtual bool hasInvolvedQuest (uint32) const
 
virtual void BuildUpdate (UpdateDataMapType &, UpdatePlayerSet &)
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
bool IsCreature () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
bool IsUnit () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual std::string GetDebugInfo () const
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (const WorldLocation &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (const Position &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (const Position &pos)
 
void Relocate (const Position *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (const Position &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (const Position &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (const Position *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (const Position *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (const Position *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (const Position *pos, float dist) const
 
bool IsWithinBox (const Position &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, const Position *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
std::string ToString () const
 

Static Public Member Functions

static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
static void DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static uint32 DealDamage (Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
static int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static void ProcDamageAndSpell (Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
static void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static bool IsDamageReducedByArmor (SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
 
static uint32 CalcArmorReducedDamage (Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
 
static void CalcAbsorbResist (DamageInfo &dmgInfo, bool Splited=false)
 
static void CalcHealAbsorb (HealInfo &healInfo)
 
static void HandleSafeUnitPointersOnDelete (Unit *thisUnit)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 

Public Attributes

uint32 m_extraAttacks
 
bool m_canDualWield
 
ControlSet m_Controlled
 
SafeUnitPointer m_movedByPlayer
 
ObjectGuid m_SummonSlot [MAX_SUMMON_SLOT]
 
ObjectGuid m_ObjectSlot [MAX_GAMEOBJECT_SLOT]
 
float m_modMeleeHitChance
 
float m_modRangedHitChance
 
float m_modSpellHitChance
 
int32 m_baseSpellCritChance
 
float m_threatModifier [MAX_SPELL_SCHOOL]
 
float m_modAttackSpeedPct [3]
 
EventProcessor m_Events
 
SpellImmuneList m_spellImmune [MAX_SPELL_IMMUNITY]
 
uint32 m_lastSanctuaryTime
 
PetAuraSet m_petAuras
 
bool IsAIEnabled
 
bool NeedChangeAI
 
bool m_ControlledByPlayer
 
bool m_CreatedByPlayer
 
std::set< SafeUnitPointer * > SafeUnitPointerSet
 
Position m_last_notify_position
 
uint32 m_last_notify_mstime
 
uint16 m_delayed_unit_relocation_timer
 
uint16 m_delayed_unit_ai_notify_timer
 
bool bRequestForcedVisibilityUpdate
 
Movement::MoveSplinemovespline
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ElunaEventProcessor * elunaEvents
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 

Protected Types

typedef std::list< DynamicObject * > DynObjectList
 
typedef GuidList GameObjectList
 
typedef std::map< ObjectGuid, float > CharmThreatMap
 

Protected Member Functions

 Unit (bool isWorldObject)
 
void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target) override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
void SetFeared (bool apply, Unit *fearedBy=nullptr, bool isFear=false)
 
void SetConfused (bool apply)
 
void SetStunned (bool apply)
 
void SetRooted (bool apply, bool isStun=false)
 
- Protected Member Functions inherited from WorldObject
 WorldObject (bool isWorldObject)
 
virtual void ProcessPositionDataChanged (PositionFullTerrainStatus const &data)
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsNeverVisible () const
 
virtual bool IsAlwaysVisibleFor (WorldObject const *) const
 
virtual bool IsInvisibleDueToDespawn () const
 
virtual bool IsAlwaysDetectableFor (WorldObject const *) const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
virtual void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target)
 
virtual void AddToObjectUpdate ()=0
 
virtual void RemoveFromObjectUpdate ()=0
 
void AddToObjectUpdateIfNeeded ()
 

Protected Attributes

UnitAIi_AI
 
UnitAIi_disabledAI
 
uint8 m_realRace
 
uint8 m_race
 
bool m_AutoRepeatFirstCast
 
int32 m_attackTimer [MAX_ATTACK]
 
float m_createStats [MAX_STATS]
 
AttackerSet m_attackers
 
Unitm_attacking
 
DeathState m_deathState
 
int32 m_procDeep
 
DynObjectList m_dynObj
 
GameObjectList m_gameObj
 
uint32 m_transform
 
Spellm_currentSpells [CURRENT_MAX_SPELL]
 
AuraMap m_ownedAuras
 
AuraApplicationMap m_appliedAuras
 
AuraList m_removedAuras
 
AuraMap::iterator m_auraUpdateIterator
 
uint32 m_removedAurasCount
 
AuraEffectList m_modAuras [TOTAL_AURAS]
 
AuraList m_scAuras
 
AuraApplicationList m_interruptableAuras
 
AuraStateAurasMap m_auraStateAuras
 
uint32 m_interruptMask
 
float m_auraModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_END]
 
float m_weaponDamage [MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
 
bool m_canModifyStats
 
VisibleAuraMap m_visibleAuras
 
float m_speed_rate [MAX_MOVE_TYPE]
 
CharmInfom_charmInfo
 
SharedVisionList m_sharedVision
 
MotionMasteri_motionMaster
 
uint32 m_reactiveTimer [MAX_REACTIVE]
 
int32 m_regenTimer
 
ThreatMgr m_ThreatMgr
 
CharmThreatMap _charmThreatInfo
 
Vehiclem_vehicle
 
Vehiclem_vehicleKit
 
uint32 m_unitTypeMask
 
LiquidTypeEntry const * _lastLiquid
 
bool m_applyResilience
 
bool _instantCast
 
uint32 m_rootTimes
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
bool m_isFarVisible
 
Optional< float > m_visibilityDistanceOverride
 
const bool m_isWorldObject
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union {
   int32 *   m_int32Values
 
   uint32 *   m_uint32Values
 
   float *   m_floatValues
 
}; 
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Private Types

typedef std::unordered_map< uint64, BuildValuesCachedBufferValuesUpdateCache
 

Private Member Functions

bool IsTriggeredAtSpellProcEvent (Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
 
bool HandleDummyAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
 
bool HandleAuraProc (Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
 
bool HandleProcTriggerSpell (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
 
bool HandleOverrideClassScriptAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
 
bool HandleAuraRaidProcFromChargeWithValue (AuraEffect *triggeredByAura)
 
bool HandleAuraRaidProcFromCharge (AuraEffect *triggeredByAura)
 
void UpdateSplineMovement (uint32 t_diff)
 
void UpdateSplinePosition ()
 
float GetCombatRatingReduction (CombatRating cr) const
 
uint32 GetCombatRatingDamageReduction (CombatRating cr, float rate, float cap, uint32 damage) const
 
void PatchValuesUpdate (ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
 
void InvalidateValuesUpdateCache ()
 
float processDummyAuras (float TakenTotalMod) const
 
void _addAttacker (Unit *pAttacker)
 
void _removeAttacker (Unit *pAttacker)
 

Private Attributes

uint32 m_state
 
uint32 m_CombatTimer
 
uint32 m_lastManaUse
 
Diminishing m_Diminishing
 
HostileRefMgr m_HostileRefMgr
 
FollowerRefMgr m_FollowingRefMgr
 
Unitm_comboTarget
 
int8 m_comboPoints
 
std::unordered_set< Unit * > m_ComboPointHolders
 
RedirectThreatInfo _redirectThreatInfo
 
bool m_cleanupDone
 
bool m_duringRemoveFromWorld
 
uint32 _oldFactionId
 faction before charm More...
 
bool _isWalkingBeforeCharm
 Are we walking before we were charmed? More...
 
uint32 _lastExtraAttackSpell
 
std::unordered_map< ObjectGuid, uint32extraAttacksTargets
 
ObjectGuid _lastDamagedTargetGuid
 
ValuesUpdateCache _valuesUpdateCache
 

Detailed Description

Member Typedef Documentation

◆ AttackerSet

typedef std::unordered_set<Unit*> Unit::AttackerSet

◆ AuraApplicationList

◆ AuraApplicationMap

◆ AuraApplicationMapBounds

typedef std::pair<AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator> Unit::AuraApplicationMapBounds

◆ AuraApplicationMapBoundsNonConst

typedef std::pair<AuraApplicationMap::iterator, AuraApplicationMap::iterator> Unit::AuraApplicationMapBoundsNonConst

◆ AuraEffectList

typedef std::list<AuraEffect*> Unit::AuraEffectList

◆ AuraList

typedef std::list<Aura*> Unit::AuraList

◆ AuraMap

typedef std::multimap<uint32, Aura*> Unit::AuraMap

◆ AuraMapBounds

typedef std::pair<AuraMap::const_iterator, AuraMap::const_iterator> Unit::AuraMapBounds

◆ AuraMapBoundsNonConst

typedef std::pair<AuraMap::iterator, AuraMap::iterator> Unit::AuraMapBoundsNonConst

◆ AuraStateAurasMap

◆ AuraStateAurasMapBounds

typedef std::pair<AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator> Unit::AuraStateAurasMapBounds

◆ CharmThreatMap

typedef std::map<ObjectGuid, float> Unit::CharmThreatMap
protected

◆ ComboPointHolderSet

◆ ControlSet

typedef std::set<Unit*> Unit::ControlSet

◆ Diminishing

◆ DynObjectList

typedef std::list<DynamicObject*> Unit::DynObjectList
protected

◆ GameObjectList

typedef GuidList Unit::GameObjectList
protected

◆ PetAuraSet

typedef std::set<PetAura const*> Unit::PetAuraSet

◆ ValuesUpdateCache

typedef std::unordered_map<uint64 , BuildValuesCachedBuffer> Unit::ValuesUpdateCache
private

◆ VisibleAuraMap

Constructor & Destructor Documentation

◆ ~Unit()

Unit::~Unit ( )
override
339{
340 // set current spells as deletable
341 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
342 if (m_currentSpells[i])
343 {
345 m_currentSpells[i] = nullptr;
346 }
347
349
350 delete i_motionMaster;
351 delete m_charmInfo;
352 delete movespline;
353
356 ASSERT(m_attackers.empty());
357
358 // pussywizard: clear m_sharedVision along with back references
359 if (!m_sharedVision.empty())
360 {
361 do
362 {
363 Player* p = *(m_sharedVision.begin());
364 p->m_isInSharedVisionOf.erase(this);
365 m_sharedVision.remove(p);
366 } while (!m_sharedVision.empty());
367 }
368
369 ASSERT(m_Controlled.empty());
370 ASSERT(m_appliedAuras.empty());
371 ASSERT(m_ownedAuras.empty());
372 ASSERT(m_removedAuras.empty());
373 ASSERT(m_gameObj.empty());
374 ASSERT(m_dynObj.empty());
375
376 if (m_movedByPlayer && m_movedByPlayer != this)
377 LOG_INFO("misc", "Unit::~Unit (A1)");
378
380}
#define LOG_INFO(filterType__,...)
Definition: Log.h:164
std::uint8_t uint8
Definition: Define.h:109
#define ASSERT
Definition: Errors.h:68
#define CURRENT_MAX_SPELL
Definition: Unit.h:544
Definition: Player.h:1064
std::set< Unit * > m_isInSharedVisionOf
Definition: Player.h:2317
bool m_duringRemoveFromWorld
Definition: Unit.h:1970
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition: Unit.h:1882
AuraList m_removedAuras
Definition: Unit.h:1886
ControlSet m_Controlled
Definition: Unit.h:1793
Movement::MoveSpline * movespline
Definition: Unit.h:1835
CharmInfo * m_charmInfo
Definition: Unit.h:1903
MotionMaster * i_motionMaster
Definition: Unit.h:1906
void _DeleteRemovedAuras()
Definition: Unit.cpp:3835
DynObjectList m_dynObj
Definition: Unit.h:1876
SafeUnitPointer m_movedByPlayer
Definition: Unit.h:1795
AttackerSet m_attackers
Definition: Unit.h:1868
Unit * m_attacking
Definition: Unit.h:1869
GameObjectList m_gameObj
Definition: Unit.h:1879
AuraMap m_ownedAuras
Definition: Unit.h:1884
AuraApplicationMap m_appliedAuras
Definition: Unit.h:1885
static void HandleSafeUnitPointersOnDelete(Unit *thisUnit)
Definition: Unit.cpp:4329
SharedVisionList m_sharedVision
Definition: Unit.h:1904
void SetReferencedFromCurrent(bool yes)
Definition: Spell.h:559

References _DeleteRemovedAuras(), ASSERT, CURRENT_MAX_SPELL, HandleSafeUnitPointersOnDelete(), i_motionMaster, LOG_INFO, m_appliedAuras, m_attackers, m_attacking, m_charmInfo, m_Controlled, m_currentSpells, m_duringRemoveFromWorld, m_dynObj, m_gameObj, Player::m_isInSharedVisionOf, m_movedByPlayer, m_ownedAuras, m_removedAuras, m_sharedVision, movespline, and Spell::SetReferencedFromCurrent().

◆ Unit()

Unit::Unit ( bool  isWorldObject)
explicitprotected
203 : WorldObject(isWorldObject),
204 m_movedByPlayer(nullptr),
206 IsAIEnabled(false),
207 NeedChangeAI(false),
209 m_CreatedByPlayer(false),
211 i_AI(nullptr),
212 i_disabledAI(nullptr),
213 m_realRace(0),
214 m_race(0),
216 m_procDeep(0),
218 i_motionMaster(new MotionMaster(this)),
219 m_regenTimer(0),
220 m_ThreatMgr(this),
221 m_vehicle(nullptr),
222 m_vehicleKit(nullptr),
224 m_HostileRefMgr(this),
225 m_comboTarget(nullptr),
227{
228#ifdef _MSC_VER
229#pragma warning(default:4355)
230#endif
233
235
242
243 m_canDualWield = false;
244
245 m_rootTimes = 0;
246
247 m_state = 0;
248 m_deathState = DeathState::Alive;
249
250 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
251 m_currentSpells[i] = nullptr;
252
253 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
254 m_SummonSlot[i].Clear();
255
256 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
257 m_ObjectSlot[i].Clear();
258
260
261 m_interruptMask = 0;
262 m_transform = 0;
263 m_canModifyStats = false;
264
265 for (uint8 i = 0; i < MAX_SPELL_IMMUNITY; ++i)
266 m_spellImmune[i].clear();
267
268 for (uint8 i = 0; i < UNIT_MOD_END; ++i)
269 {
274 }
275 // implement 50% base damage from offhand
277
278 for (uint8 i = 0; i < MAX_ATTACK; ++i)
279 {
282
283 m_weaponDamage[i][MINDAMAGE][1] = 0.f;
284 m_weaponDamage[i][MAXDAMAGE][1] = 0.f;
285 }
286
287 for (uint8 i = 0; i < MAX_STATS; ++i)
288 m_createStats[i] = 0.0f;
289
290 m_attacking = nullptr;
291 m_modMeleeHitChance = 0.0f;
293 m_modSpellHitChance = 0.0f;
295
296 m_CombatTimer = 0;
297 m_lastManaUse = 0;
298
299 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
300 m_threatModifier[i] = 1.0f;
301
302 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
303 m_speed_rate[i] = 1.0f;
304
305 m_charmInfo = nullptr;
306
308
309 // remove aurastates allowing special moves
310 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
311 m_reactiveTimer[i] = 0;
312
313 m_cleanupDone = false;
315
317
318 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
323
324 m_applyResilience = false;
325 _instantCast = false;
326
327 _lastLiquid = nullptr;
328
329 _oldFactionId = 0;
330
331 _isWalkingBeforeCharm = false;
332
334}
@ MINDAMAGE
Definition: Unit.h:135
@ MAXDAMAGE
Definition: Unit.h:136
@ UNIT_MOD_DAMAGE_OFFHAND
Definition: Unit.h:166
@ UNIT_MOD_END
Definition: Unit.h:168
#define MAX_SUMMON_SLOT
Definition: Unit.h:601
@ OFF_ATTACK
Definition: Unit.h:210
@ MAX_ATTACK
Definition: Unit.h:212
@ BASE_ATTACK
Definition: Unit.h:209
@ RANGED_ATTACK
Definition: Unit.h:211
@ BASE_VALUE
Definition: Unit.h:126
@ TOTAL_VALUE
Definition: Unit.h:128
@ TOTAL_PCT
Definition: Unit.h:129
@ BASE_PCT
Definition: Unit.h:127
#define BASE_MAXDAMAGE
Definition: Unit.h:40
@ MAX_REACTIVE
Definition: Unit.h:593
#define MAX_GAMEOBJECT_SLOT
Definition: Unit.h:603
#define BASE_MINDAMAGE
Definition: Unit.h:39
@ UNIT_MASK_NONE
Definition: UnitDefines.h:134
#define MAX_MOVE_TYPE
Definition: UnitDefines.h:339
@ UPDATEFLAG_LIVING
Definition: UpdateData.h:44
@ UPDATEFLAG_STATIONARY_POSITION
Definition: UpdateData.h:45
@ TYPEID_UNIT
Definition: ObjectGuid.h:35
@ TYPEMASK_UNIT
Definition: ObjectGuid.h:49
@ SERVERSIDE_VISIBILITY_GHOST
Definition: SharedDefines.h:1274
#define MAX_STATS
Definition: SharedDefines.h:265
constexpr auto MAX_SPELL_SCHOOL
Definition: SharedDefines.h:292
@ GHOST_VISIBILITY_ALIVE
Definition: SharedDefines.h:1281
#define MAX_SPELL_IMMUNITY
Definition: SharedDefines.h:1404
Definition: ThreatMgr.h:294
uint16 m_objectType
Definition: Object.h:240
uint16 m_updateFlag
Definition: Object.h:243
TypeID m_objectTypeId
Definition: Object.h:242
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition: Object.h:372
Definition: Object.h:405
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition: Object.h:523
void Relocate(float x, float y)
Definition: Position.h:73
uint32 m_reactiveTimer[MAX_REACTIVE]
Definition: Unit.h:1908
uint32 m_lastSanctuaryTime
Definition: Unit.h:1812
LiquidTypeEntry const * _lastLiquid
Definition: Unit.h:1919
uint32 m_transform
Definition: Unit.h:1880
uint32 m_CombatTimer
Definition: Unit.h:1953
bool m_canModifyStats
Definition: Unit.h:1898
UnitAI * i_disabledAI
Definition: Unit.h:1857
bool NeedChangeAI
Definition: Unit.h:1819
uint32 m_state
Definition: Unit.h:1952
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]
Definition: Unit.h:1896
int32 m_attackTimer[MAX_ATTACK]
Definition: Unit.h:1864
float m_modAttackSpeedPct[3]
Definition: Unit.h:1806
uint8 m_realRace
Definition: Unit.h:1859
Vehicle * m_vehicle
Definition: Unit.h:1915
uint32 m_rootTimes
Definition: Unit.h:1925
uint8 m_race
Definition: Unit.h:1860
UnitAI * i_AI
Definition: Unit.h:1856
uint32 _lastExtraAttackSpell
Definition: Unit.h:1975
bool _instantCast
Definition: Unit.h:1923
ObjectGuid m_ObjectSlot[MAX_GAMEOBJECT_SLOT]
Definition: Unit.h:1798
RedirectThreatInfo _redirectThreatInfo
Definition: Unit.h:1967
float m_createStats[MAX_STATS]
Definition: Unit.h:1866
float m_modRangedHitChance
Definition: Unit.h:1801
DeathState m_deathState
Definition: Unit.h:1871
uint32 m_unitTypeMask
Definition: Unit.h:1918
uint32 m_removedAurasCount
Definition: Unit.h:1888
ThreatMgr m_ThreatMgr
Definition: Unit.h:1911
Unit * m_comboTarget
Definition: Unit.h:1963
AuraMap::iterator m_auraUpdateIterator
Definition: Unit.h:1887
bool m_AutoRepeatFirstCast
Definition: Unit.h:1862
uint16 m_delayed_unit_ai_notify_timer
Definition: Unit.h:1831
int32 m_regenTimer
Definition: Unit.h:1909
bool bRequestForcedVisibilityUpdate
Definition: Unit.h:1832
bool m_ControlledByPlayer
Definition: Unit.h:1821
uint32 m_last_notify_mstime
Definition: Unit.h:1829
SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY]
Definition: Unit.h:1811
int8 m_comboPoints
Definition: Unit.h:1964
uint32 _oldFactionId
faction before charm
Definition: Unit.h:1972
int32 m_baseSpellCritChance
Definition: Unit.h:1803
float m_modMeleeHitChance
Definition: Unit.h:1800
float m_weaponDamage[MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
Definition: Unit.h:1897
Position m_last_notify_position
Definition: Unit.h:1828
Vehicle * m_vehicleKit
Definition: Unit.h:1916
bool IsAIEnabled
Definition: Unit.h:1818
HostileRefMgr m_HostileRefMgr
Definition: Unit.h:1959
bool m_applyResilience
Definition: Unit.h:1922
bool m_canDualWield
Definition: Unit.h:1791
uint32 m_interruptMask
Definition: Unit.h:1894
int32 m_procDeep
Definition: Unit.h:1873
float m_speed_rate[MAX_MOVE_TYPE]
Definition: Unit.h:1901
float m_modSpellHitChance
Definition: Unit.h:1802
ObjectGuid m_SummonSlot[MAX_SUMMON_SLOT]
Definition: Unit.h:1797
bool m_cleanupDone
Definition: Unit.h:1969
bool _isWalkingBeforeCharm
Are we walking before we were charmed?
Definition: Unit.h:1973
bool m_CreatedByPlayer
Definition: Unit.h:1822
uint16 m_delayed_unit_relocation_timer
Definition: Unit.h:1830
float m_threatModifier[MAX_SPELL_SCHOOL]
Definition: Unit.h:1805
uint32 m_lastManaUse
Definition: Unit.h:1954
Definition: MotionMaster.h:110
Definition: MoveSpline.h:40

References _instantCast, _isWalkingBeforeCharm, _lastExtraAttackSpell, _lastLiquid, _oldFactionId, _redirectThreatInfo, BASE_ATTACK, BASE_MAXDAMAGE, BASE_MINDAMAGE, BASE_PCT, BASE_VALUE, bRequestForcedVisibilityUpdate, CURRENT_MAX_SPELL, GHOST_VISIBILITY_ALIVE, m_applyResilience, m_attacking, m_attackTimer, m_auraModifiersGroup, m_auraUpdateIterator, m_baseSpellCritChance, m_canDualWield, m_canModifyStats, m_charmInfo, m_cleanupDone, m_CombatTimer, m_createStats, m_currentSpells, m_deathState, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_duringRemoveFromWorld, m_interruptMask, m_last_notify_mstime, m_last_notify_position, m_lastManaUse, m_modAttackSpeedPct, m_modMeleeHitChance, m_modRangedHitChance, m_modSpellHitChance, m_ObjectSlot, Object::m_objectType, Object::m_objectTypeId, m_ownedAuras, m_reactiveTimer, m_rootTimes, WorldObject::m_serverSideVisibility, m_speed_rate, m_spellImmune, m_state, m_SummonSlot, m_threatModifier, m_transform, Object::m_updateFlag, m_weaponDamage, MAX_ATTACK, MAX_GAMEOBJECT_SLOT, MAX_MOVE_TYPE, MAX_REACTIVE, MAX_SPELL_IMMUNITY, MAX_SPELL_SCHOOL, MAX_STATS, MAX_SUMMON_SLOT, MAXDAMAGE, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, Position::Relocate(), SERVERSIDE_VISIBILITY_GHOST, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), TOTAL_PCT, TOTAL_VALUE, TYPEID_UNIT, TYPEMASK_UNIT, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_END, UPDATEFLAG_LIVING, and UPDATEFLAG_STATIONARY_POSITION.

Member Function Documentation

◆ _addAttacker()

void Unit::_addAttacker ( Unit pAttacker)
inlineprivate
1948{ m_attackers.insert(pAttacker); }

References m_attackers.

Referenced by Attack().

◆ _AddAura()

void Unit::_AddAura ( UnitAura aura,
Unit caster 
)
4415{
4417 m_ownedAuras.insert(AuraMap::value_type(aura->GetId(), aura));
4418
4420
4421 if (aura->IsRemoved())
4422 return;
4423
4425 if (aura->IsSingleTarget())
4426 {
4427 ASSERT((IsInWorld() && !IsDuringRemoveFromWorld()) || (aura->GetCasterGUID() == GetGUID()));
4428 /* @HACK: Player is not in world during loading auras.
4429 * Single target auras are not saved or loaded from database
4430 * but may be created as a result of aura links (player mounts with passengers)
4431 */
4432
4433 // register single target aura
4434 caster->GetSingleCastAuras().push_back(aura);
4435 // remove other single target auras
4436 Unit::AuraList& scAuras = caster->GetSingleCastAuras();
4437 for (Unit::AuraList::iterator itr = scAuras.begin(); itr != scAuras.end();)
4438 {
4439 if ((*itr) != aura &&
4440 (*itr)->IsSingleTargetWith(aura))
4441 {
4442 (*itr)->Remove();
4443 itr = scAuras.begin();
4444 }
4445 else
4446 ++itr;
4447 }
4448 }
4449}
@ SPELL_AURA_CONTROL_VEHICLE
Definition: SpellAuraDefines.h:299
bool IsInWorld() const
Definition: Object.h:104
ObjectGuid GetGUID() const
Definition: Object.h:110
void _RemoveNoStackAurasDueToAura(Aura *aura)
Definition: Unit.cpp:4667
std::list< Aura * > AuraList
Definition: Unit.h:647
bool IsDuringRemoveFromWorld() const
Definition: Unit.h:1726
AuraList & GetSingleCastAuras()
Definition: Unit.h:1375
ObjectGuid GetCasterGUID() const
Definition: SpellAuras.h:105
bool IsRemoved() const
Definition: SpellAuras.h:161
uint32 GetId() const
Definition: SpellAuras.cpp:466
bool HasEffectType(AuraType type) const
Definition: SpellAuras.cpp:1222
SpellInfo const * GetSpellInfo() const
Definition: SpellAuras.h:100
void SetIsSingleTarget(bool val)
Definition: SpellAuras.h:166
bool IsSingleTarget() const
Definition: SpellAuras.h:164
bool IsSingleTarget() const
Definition: SpellInfo.cpp:1373

References _RemoveNoStackAurasDueToAura(), ASSERT, Aura::GetCasterGUID(), Object::GetGUID(), Aura::GetId(), GetSingleCastAuras(), Aura::GetSpellInfo(), Aura::HasEffectType(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Aura::IsRemoved(), Aura::IsSingleTarget(), SpellInfo::IsSingleTarget(), Aura::IsSingleTargetWith(), m_cleanupDone, m_ownedAuras, Aura::SetIsSingleTarget(), and SPELL_AURA_CONTROL_VEHICLE.

Referenced by UnitAura::UnitAura().

◆ _ApplyAllAuraStatMods()

void Unit::_ApplyAllAuraStatMods ( )
5489{
5490 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5491 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, true);
5492}
@ AURA_EFFECT_HANDLE_STAT
Definition: SpellAuraDefines.h:46

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_ApplyAllStatBonuses().

◆ _ApplyAura()

void Unit::_ApplyAura ( AuraApplication aurApp,
uint8  effMask 
)
4506{
4507 Aura* aura = aurApp->GetBase();
4508
4510
4511 if (aurApp->GetRemoveMode())
4512 return;
4513
4514 Unit* caster = aura->GetCaster();
4515
4516 // Update target aura state flag
4517 SpellInfo const* spellInfo = aura->GetSpellInfo();
4518 if (AuraStateType aState = spellInfo->GetAuraState())
4519 {
4520 uint32 aStateMask = (1 << (aState - 1));
4521 // force update so the new caster registers it
4522 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) && HasFlag(UNIT_FIELD_AURASTATE, aStateMask))
4524 else
4525 ModifyAuraState(aState, true);
4526 }
4527
4528 if (aurApp->GetRemoveMode())
4529 return;
4530
4531 // Sitdown on apply aura req seated
4534
4535 if (aurApp->GetRemoveMode())
4536 return;
4537
4538 aura->HandleAuraSpecificMods(aurApp, caster, true, false);
4539
4540 // apply effects of the aura
4541 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4542 {
4543 if (effMask & 1 << i && (!aurApp->GetRemoveMode()))
4544 aurApp->_HandleEffect(i, true);
4545 }
4546
4547 sScriptMgr->OnAuraApply(this, aura);
4548}
std::uint32_t uint32
Definition: Define.h:107
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition: SpellDefines.h:61
#define sScriptMgr
Definition: ScriptMgr.h:708
@ UNIT_STAND_STATE_SIT
Definition: UnitDefines.h:33
@ UNIT_FIELD_AURASTATE
Definition: UpdateFields.h:119
#define PER_CASTER_AURA_STATE_MASK
Definition: SharedDefines.h:1318
AuraStateType
Definition: SharedDefines.h:1288
#define MAX_SPELL_EFFECTS
Definition: DBCStructure.h:1636
bool HasFlag(uint16 index, uint32 flag) const
Definition: Object.cpp:889
void ForceValuesUpdateAtIndex(uint32)
Definition: Object.cpp:2067
Definition: Unit.h:630
void ModifyAuraState(AuraStateType flag, bool apply)
Definition: Unit.cpp:10488
void SetStandState(uint8 state)
Definition: Unit.cpp:16713
bool IsSitState() const
Definition: Unit.cpp:16698
void _HandleEffect(uint8 effIndex, bool apply)
Definition: SpellAuras.cpp:161
Aura * GetBase() const
Definition: SpellAuras.h:62
AuraRemoveMode GetRemoveMode() const
Definition: SpellAuras.h:73
Definition: SpellAuras.h:87
Unit * GetCaster() const
Definition: SpellAuras.cpp:471
void HandleAuraSpecificMods(AuraApplication const *aurApp, Unit *caster, bool apply, bool onReapply)
Definition: SpellAuras.cpp:1265
Definition: SpellInfo.h:316
AuraStateType GetAuraState() const
Definition: SpellInfo.cpp:2059
uint32 AuraInterruptFlags
Definition: SpellInfo.h:353

References AuraApplication::_HandleEffect(), _RemoveNoStackAurasDueToAura(), AURA_INTERRUPT_FLAG_NOT_SEATED, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), Aura::HandleAuraSpecificMods(), Object::HasFlag(), IsSitState(), MAX_SPELL_EFFECTS, ModifyAuraState(), PER_CASTER_AURA_STATE_MASK, SetStandState(), sScriptMgr, UNIT_FIELD_AURASTATE, and UNIT_STAND_STATE_SIT.

Referenced by _ApplyAuraEffect().

◆ _ApplyAuraEffect()

void Unit::_ApplyAuraEffect ( Aura aura,
uint8  effIndex 
)
4492{
4493 ASSERT(aura);
4494 ASSERT(aura->HasEffect(effIndex));
4496 ASSERT(aurApp);
4497 if (!aurApp->GetEffectMask())
4498 _ApplyAura(aurApp, 1 << effIndex);
4499 else
4500 aurApp->_HandleEffect(effIndex, true);
4501}
void _ApplyAura(AuraApplication *aurApp, uint8 effMask)
Definition: Unit.cpp:4505
Definition: SpellAuras.h:37
uint8 GetEffectMask() const
Definition: SpellAuras.h:66
bool HasEffect(uint8 effIndex) const
Definition: SpellAuras.h:173
const AuraApplication * GetApplicationOfTarget(ObjectGuid guid) const
Definition: SpellAuras.h:183

References _ApplyAura(), AuraApplication::_HandleEffect(), ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetEffectMask(), Object::GetGUID(), and Aura::HasEffect().

◆ _CreateAuraApplication()

AuraApplication * Unit::_CreateAuraApplication ( Aura aura,
uint8  effMask 
)
4454{
4455 // can't apply aura on unit which is going to be deleted - to not create a memory leak
4457 // aura musn't be removed
4458 ASSERT(!aura->IsRemoved());
4459
4460 // aura mustn't be already applied on target
4461 ASSERT (!aura->IsAppliedOnTarget(GetGUID()) && "Unit::_CreateAuraApplication: aura musn't be applied on target");
4462
4463 SpellInfo const* aurSpellInfo = aura->GetSpellInfo();
4464 uint32 aurId = aurSpellInfo->Id;
4465
4466 // ghost spell check, allow apply any auras at player loading in ghost mode (will be cleanup after load)
4467 // Xinef: Added IsAllowingDeadTarget check
4468 if (!IsAlive() && !aurSpellInfo->IsDeathPersistent() && !aurSpellInfo->IsAllowingDeadTarget() && (!IsPlayer() || !ToPlayer()->GetSession()->PlayerLoading()))
4469 return nullptr;
4470
4471 Unit* caster = aura->GetCaster();
4472
4473 AuraApplication* aurApp = new AuraApplication(this, caster, aura, effMask);
4474 m_appliedAuras.insert(AuraApplicationMap::value_type(aurId, aurApp));
4475
4476 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4477 // xinef: even if it gets removed, it will be reapplied in a second
4478 if (aurSpellInfo->AuraInterruptFlags && this == aura->GetOwner())
4479 {
4480 m_interruptableAuras.push_back(aurApp);
4481 AddInterruptMask(aurSpellInfo->AuraInterruptFlags);
4482 }
4483
4484 if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState())
4485 m_auraStateAuras.insert(AuraStateAurasMap::value_type(aState, aurApp));
4486
4487 aura->_ApplyForTarget(this, caster, aurApp);
4488 return aurApp;
4489}
bool IsPlayer() const
Definition: Object.h:197
Player * ToPlayer()
Definition: Object.h:198
void AddInterruptMask(uint32 mask)
Definition: Unit.h:1516
bool IsAlive() const
Definition: Unit.h:1216
AuraApplicationList m_interruptableAuras
Definition: Unit.h:1892
AuraStateAurasMap m_auraStateAuras
Definition: Unit.h:1893
WorldObject * GetOwner() const
Definition: SpellAuras.h:107
bool IsAppliedOnTarget(ObjectGuid guid) const
Definition: SpellAuras.h:185
virtual void _ApplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition: SpellAuras.cpp:492
bool IsDeathPersistent() const
Definition: SpellInfo.cpp:1216
uint32 Id
Definition: SpellInfo.h:320
bool IsAllowingDeadTarget() const
Definition: SpellInfo.cpp:1226

References Aura::_ApplyForTarget(), AddInterruptMask(), ASSERT, SpellInfo::AuraInterruptFlags, SpellInfo::GetAuraState(), Aura::GetCaster(), Object::GetGUID(), Aura::GetOwner(), Aura::GetSpellInfo(), SpellInfo::Id, IsAlive(), SpellInfo::IsAllowingDeadTarget(), Aura::IsAppliedOnTarget(), SpellInfo::IsDeathPersistent(), Object::IsPlayer(), Aura::IsRemoved(), m_appliedAuras, m_auraStateAuras, m_cleanupDone, m_interruptableAuras, and Object::ToPlayer().

◆ _DeleteRemovedAuras()

void Unit::_DeleteRemovedAuras ( )
protected
3836{
3837 while (!m_removedAuras.empty())
3838 {
3839 delete m_removedAuras.front();
3840 m_removedAuras.pop_front();
3841 }
3842}

References m_removedAuras.

Referenced by _UpdateSpells(), and ~Unit().

◆ _EnterVehicle()

void Unit::_EnterVehicle ( Vehicle vehicle,
int8  seatId,
AuraApplication const *  aurApp = nullptr 
)
19642{
19643 // Must be called only from aura handler
19644 if (!IsAlive() || GetVehicleKit() == vehicle || vehicle->GetBase()->IsOnVehicle(this))
19645 return;
19646
19647 if (m_vehicle)
19648 {
19649 if (m_vehicle == vehicle)
19650 {
19651 if (seatId >= 0 && seatId != GetTransSeat())
19652 {
19653 LOG_DEBUG("vehicles", "EnterVehicle: {} leave vehicle {} seat {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), GetTransSeat(), seatId);
19654 ChangeSeat(seatId);
19655 }
19656
19657 return;
19658 }
19659 else
19660 {
19661 LOG_DEBUG("vehicles", "EnterVehicle: {} exit {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), vehicle->GetBase()->GetEntry());
19662 ExitVehicle();
19663 }
19664 }
19665
19666 if (!aurApp || aurApp->GetRemoveMode())
19667 return;
19668
19669 if (Player* player = ToPlayer())
19670 {
19671 if (vehicle->GetBase()->IsPlayer() && player->IsInCombat())
19672 return;
19673
19674 sScriptMgr->AnticheatSetUnderACKmount(player);
19675
19677 player->StopCastingCharm();
19678 player->StopCastingBindSight();
19679 Dismount();
19681
19682 // drop flag at invisible in bg
19683 if (Battleground* bg = player->GetBattleground())
19684 bg->EventPlayerDroppedFlag(player);
19685
19687 player->GetSession()->SendPacket(&data);
19688 }
19689
19690 ASSERT(!m_vehicle);
19691 m_vehicle = vehicle;
19692
19693 if (!m_vehicle->AddPassenger(this, seatId))
19694 {
19695 m_vehicle = nullptr;
19696 return;
19697 }
19698
19699 // Xinef: remove movement auras when entering vehicle (food buffs etc)
19701}
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:168
@ AURA_INTERRUPT_FLAG_MOVE
Definition: SpellDefines.h:46
@ AURA_INTERRUPT_FLAG_TURNING
Definition: SpellDefines.h:47
@ SPELL_AURA_MOUNTED
Definition: SpellAuraDefines.h:141
@ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA
Definition: Opcodes.h:1211
Definition: Battleground.h:303
uint32 GetEntry() const
Definition: Object.h:112
int8 GetTransSeat() const
Definition: Object.h:605
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4129
void Dismount()
Definition: Unit.cpp:13510
bool IsOnVehicle(Unit const *vehicle) const
Definition: Unit.h:1688
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition: Unit.cpp:5110
void ChangeSeat(int8 seatId, bool next=true)
Definition: Unit.cpp:19703
Vehicle * GetVehicleKit() const
Definition: Unit.h:1686
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition: Unit.cpp:5181
void ExitVehicle(Position const *exitPosition=nullptr)
Definition: Unit.cpp:19722
Unit * GetBase() const
May be called from scripts.
Definition: Vehicle.h:37
bool AddPassenger(Unit *passenger, int8 seatId=-1)
Definition: Vehicle.cpp:317
Definition: WorldPacket.h:27

References Vehicle::AddPassenger(), ASSERT, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, ChangeSeat(), Dismount(), ExitVehicle(), Vehicle::GetBase(), Object::GetEntry(), AuraApplication::GetRemoveMode(), WorldObject::GetTransSeat(), GetVehicleKit(), InterruptNonMeleeSpells(), IsAlive(), IsOnVehicle(), Object::IsPlayer(), LOG_DEBUG, m_vehicle, RemoveAurasByType(), RemoveAurasWithInterruptFlags(), SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SPELL_AURA_MOUNTED, sScriptMgr, and Object::ToPlayer().

Referenced by AuraEffect::HandleAuraControlVehicle().

◆ _ExitVehicle()

void Unit::_ExitVehicle ( Position const *  exitPosition = nullptr)
19760{
19761 if (!m_vehicle)
19762 return;
19763
19764 // This should be done before dismiss, because there may be some aura removal
19767
19768 Player* player = ToPlayer();
19769
19770 // If player is on mouted duel and exits the mount should immediatly lose the duel
19771 if (player && player->duel && player->duel->IsMounted)
19772 player->DuelComplete(DUEL_FLED);
19773
19774 Vehicle* vehicle = m_vehicle;
19775 Unit* vehicleBase = m_vehicle->GetBase();
19776 m_vehicle = nullptr;
19777
19778 if (!vehicleBase)
19779 return;
19780
19781 SetControlled(false, UNIT_STATE_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT
19782
19783 Position pos;
19784 // If we ask for a specific exit position, use that one. Otherwise allow scripts to modify it
19785 if (exitPosition)
19786 pos = *exitPosition;
19787 else
19788 {
19789 // Set exit position to vehicle position and use the current orientation
19790 pos = vehicleBase->GetPosition(); // This should use passenger's current position, leaving it as it is now
19791 pos.SetOrientation(vehicleBase->GetOrientation());
19792
19793 // Change exit position based on seat entry addon data
19794 if (seatAddon)
19795 {
19796 if (seatAddon->ExitParameter == VehicleExitParameters::VehicleExitParamOffset)
19797 pos.RelocateOffset({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19798 else if (seatAddon->ExitParameter == VehicleExitParameters::VehicleExitParamDest)
19799 pos.Relocate({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19800 }
19801 }
19802
19804
19805 if (player)
19806 {
19808
19809 sScriptMgr->AnticheatSetUnderACKmount(player);
19810 }
19812 {
19814 data << GetPackGUID();
19815 SendMessageToSet(&data, false);
19816 }
19817
19818 // xinef: hack for flameleviathan seat vehicle
19819 VehicleEntry const* vehicleInfo = vehicle->GetVehicleInfo();
19820 if (!vehicleInfo || vehicleInfo->m_ID != 341)
19821 {
19822 Movement::MoveSplineInit init(this);
19823 init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
19824 init.SetFacing(vehicleBase->GetOrientation());
19825 init.SetTransportExit();
19826 init.Launch();
19827 }
19828 else
19829 {
19830 float o = pos.GetAngle(this);
19831 Movement::MoveSplineInit init(this);
19832 init.MoveTo(pos.GetPositionX() + 8 * cos(o), pos.GetPositionY() + 8 * std::sin(o), pos.GetPositionZ() + 16.0f);
19833 init.SetFacing(GetOrientation());
19834 init.SetTransportExit();
19835 init.Launch();
19836 DisableSpline();
19837 KnockbackFrom(pos.GetPositionX(), pos.GetPositionY(), 10.0f, 20.0f);
19839 }
19840
19841 // xinef: move fall, should we support all creatures that exited vehicle in air? Currently Quest Drag and Drop only, Air Assault quest
19842 if (IsCreature() && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298))
19843 {
19845 }
19846
19847 if ((!player || !(player->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT)) && vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION))
19848 if (((Minion*)vehicleBase)->GetOwner() == this)
19849 {
19850 if (!vehicleInfo || vehicleInfo->m_ID != 349)
19851 {
19852 vehicle->Dismiss();
19853 }
19854 else if (vehicleBase->IsCreature())
19855 {
19856 vehicle->Uninstall();
19857 vehicleBase->m_Events.AddEvent(new VehicleDespawnEvent(*vehicleBase, 2000), vehicleBase->m_Events.CalculateTime(2000));
19858 }
19859
19860 // xinef: ugly hack, no appripriate hook later to cast spell
19861 if (player)
19862 {
19863 if (vehicleBase->GetEntry() == NPC_EIDOLON_WATCHER)
19864 player->CastSpell(player, VEHICLE_SPELL_SHADE_CONTROL_END, true);
19865 else if (vehicleBase->GetEntry() == NPC_LITHE_STALKER)
19866 player->CastSpell(player, VEHICLE_SPELL_GEIST_CONTROL_END, true);
19867 }
19868 }
19869
19871 {
19872 // Vehicle just died, we die too
19873 if (vehicleBase->getDeathState() == DeathState::JustDied)
19874 setDeathState(DeathState::JustDied);
19875 // If for other reason we as minion are exiting the vehicle (ejected, master dismounted) - unsummon
19876 else
19877 ToTempSummon()->UnSummon(2000); // Approximation
19878 }
19879
19880 if (player)
19881 {
19883 player->SetCanTeleport(true);
19884 }
19885}
@ DELAYED_VEHICLE_TELEPORT
Definition: Player.h:909
@ MOVEMENTFLAG_ROOT
Definition: UnitDefines.h:355
@ UNIT_MASK_ACCESSORY
Definition: UnitDefines.h:144
@ UNIT_MASK_MINION
Definition: UnitDefines.h:136
@ UNIT_STATE_ROOT
Definition: UnitDefines.h:159
@ UNIT_STATE_MOVE
Definition: UnitDefines.h:168
@ VEHICLE_SPELL_PARACHUTE
Definition: VehicleDefines.h:53
@ VEHICLE_SPELL_SHADE_CONTROL_END
Definition: VehicleDefines.h:56
@ VEHICLE_SPELL_GEIST_CONTROL_END
Definition: VehicleDefines.h:55
@ NPC_EIDOLON_WATCHER
Definition: VehicleDefines.h:69
@ NPC_LITHE_STALKER
Definition: VehicleDefines.h:70
@ DUEL_FLED
Definition: SharedDefines.h:3614
@ SMSG_SPLINE_MOVE_UNROOT
Definition: Opcodes.h:802
Seconds GetGameTime()
Definition: GameTime.cpp:38
void AddEvent(BasicEvent *Event, uint64 e_time, bool set_addtime=true)
Definition: EventProcessor.h:103
uint64 CalculateTime(uint64 t_offset) const
Definition: EventProcessor.cpp:159
virtual void UnSummon(uint32 msTime=0)
Definition: TemporarySummon.cpp:282
Definition: TemporarySummon.h:76
PackedGuid const & GetPackGUID() const
Definition: Object.h:111
bool IsCreature() const
Definition: Object.h:201
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition: Object.cpp:2080
Definition: Position.h:28
void RelocateOffset(const Position &offset)
Definition: Position.cpp:58
float GetPositionZ() const
Definition: Position.h:119
float GetOrientation() const
Definition: Position.h:120
void SetOrientation(float orientation)
Definition: Position.h:112
float GetPositionX() const
Definition: Position.h:117
void GetPosition(float &x, float &y) const
Definition: Position.h:122
float GetPositionY() const
Definition: Position.h:118
float GetAngle(const Position *pos) const
Definition: Position.cpp:77
void SetCanTeleport(bool value)
Definition: Player.h:2480
void DuelComplete(DuelCompleteType type)
Definition: Player.cpp:6410
void SetFallInformation(uint32 time, float z)
Definition: Player.h:2318
std::unique_ptr< DuelInfo > duel
Definition: Player.h:1860
void ResummonPetTemporaryUnSummonedIfAny()
Definition: Player.cpp:14235
uint32 GetDelayedOperations() const
Definition: Player.h:2080
virtual void setDeathState(DeathState s, bool despawn=false)
Definition: Unit.cpp:14539
Unit * GetOwner() const
Definition: Unit.cpp:10591
DeathState getDeathState()
Definition: Unit.h:1219
virtual bool CanFly() const =0
MotionMaster * GetMotionMaster()
Definition: Unit.h:1615
TempSummon * ToTempSummon()
Definition: Unit.h:1730
void DisableSpline()
Definition: Unit.cpp:636
void AddUnitState(uint32 f)
Definition: Unit.h:672
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition: Unit.cpp:18021
EventProcessor m_Events
Definition: Unit.h:1809
bool HasUnitMovementFlag(uint32 f) const
Definition: Unit.h:1627
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1167
uint32 HasUnitTypeMask(uint32 mask) const
Definition: Unit.h:677
void KnockbackFrom(float x, float y, float speedXY, float speedZ)
Definition: Unit.cpp:19130
Definition: Vehicle.h:28
void Dismiss()
Definition: Vehicle.cpp:538
VehicleEntry const * GetVehicleInfo() const
Definition: Vehicle.h:38
void RemovePassenger(Unit *passenger)
Definition: Vehicle.cpp:459
void Uninstall()
Definition: Vehicle.cpp:100
VehicleSeatAddon const * GetSeatAddonForSeatOfPassenger(Unit const *passenger) const
Definition: Vehicle.cpp:236
Definition: Vehicle.h:101
Definition: VehicleDefines.h:86
float ExitParameterO
Definition: VehicleDefines.h:96
float ExitParameterX
Definition: VehicleDefines.h:93
float ExitParameterY
Definition: VehicleDefines.h:94
float ExitParameterZ
Definition: VehicleDefines.h:95
VehicleExitParameters ExitParameter
Definition: VehicleDefines.h:97
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:627
Definition: MoveSplineInit.h:71
Definition: DBCStructure.h:2026
uint32 m_ID
Definition: DBCStructure.h:2027

References EventProcessor::AddEvent(), AddUnitState(), EventProcessor::CalculateTime(), CanFly(), CastSpell(), DELAYED_VEHICLE_TELEPORT, DisableSpline(), Vehicle::Dismiss(), Player::duel, DUEL_FLED, Player::DuelComplete(), VehicleSeatAddon::ExitParameter, VehicleSeatAddon::ExitParameterO, VehicleSeatAddon::ExitParameterX, VehicleSeatAddon::ExitParameterY, VehicleSeatAddon::ExitParameterZ, Position::GetAngle(), Vehicle::GetBase(), getDeathState(), Player::GetDelayedOperations(), Object::GetEntry(), GameTime::GetGameTime(), GetMotionMaster(), Position::GetOrientation(), GetOwner(), Object::GetPackGUID(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Vehicle::GetSeatAddonForSeatOfPassenger(), Vehicle::GetVehicleInfo(), HasUnitMovementFlag(), HasUnitTypeMask(), Object::IsCreature(), KnockbackFrom(), Movement::MoveSplineInit::Launch(), m_Events, VehicleEntry::m_ID, m_vehicle, MotionMaster::MoveFall(), MOVEMENTFLAG_ROOT, Movement::MoveSplineInit::MoveTo(), NPC_EIDOLON_WATCHER, NPC_LITHE_STALKER, Position::Relocate(), Position::RelocateOffset(), Vehicle::RemovePassenger(), Player::ResummonPetTemporaryUnSummonedIfAny(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), SetControlled(), setDeathState(), Movement::MoveSplineInit::SetFacing(), Player::SetFallInformation(), Position::SetOrientation(), Movement::MoveSplineInit::SetTransportExit(), SMSG_SPLINE_MOVE_UNROOT, sScriptMgr, Object::ToPlayer(), ToTempSummon(), Vehicle::Uninstall(), UNIT_MASK_ACCESSORY, UNIT_MASK_MINION, UNIT_STATE_MOVE, UNIT_STATE_ROOT, TempSummon::UnSummon(), VEHICLE_SPELL_GEIST_CONTROL_END, VEHICLE_SPELL_PARACHUTE, and VEHICLE_SPELL_SHADE_CONTROL_END.

Referenced by AuraEffect::HandleAuraControlVehicle(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ _IsNoStackAuraDueToAura()

bool Unit::_IsNoStackAuraDueToAura ( Aura appliedAura,
Aura existingAura 
) const

◆ _IsValidAssistTarget()

bool Unit::_IsValidAssistTarget ( Unit const *  target,
SpellInfo const *  bySpell 
) const
13987{
13988 ASSERT(target);
13989
13990 // can assist to self
13991 if (this == target)
13992 return true;
13993
13994 // can't assist unattackable units or GMs
13995 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
13996 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
13997 return false;
13998
13999 // can't assist own vehicle or passenger
14000 if (m_vehicle)
14001 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
14002 return false;
14003
14004 // can't assist invisible
14005 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
14006 return false;
14007
14008 // can't assist dead
14009 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
14010 return false;
14011
14012 // can't assist untargetable
14013 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
14014 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
14015 return false;
14016
14017 if (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14018 {
14019 // xinef: do not allow to assist non attackable units
14020 if (target->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
14021 return false;
14022
14024 {
14025 if (target->IsImmuneToPC())
14026 return false;
14027 }
14028 else
14029 {
14030 if (target->IsImmuneToNPC())
14031 return false;
14032 }
14033 }
14034
14035 // can't assist non-friendly targets
14036 if (GetReactionTo(target) < REP_NEUTRAL
14037 && target->GetReactionTo(this) < REP_NEUTRAL
14038 && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)))
14039 return false;
14040
14041 // PvP case
14042 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
14043 {
14044 Player const* targetPlayerOwner = target->GetAffectingPlayer();
14046 {
14047 Player const* selfPlayerOwner = GetAffectingPlayer();
14048 if (selfPlayerOwner && targetPlayerOwner)
14049 {
14050 // can't assist player which is dueling someone
14051 if (selfPlayerOwner != targetPlayerOwner
14052 && targetPlayerOwner->duel)
14053 return false;
14054 }
14055 // can't assist player in ffa_pvp zone from outside
14056 if (target->IsFFAPvP() && !IsFFAPvP())
14057 return false;
14058
14059 // can't assist player out of sanctuary from sanctuary if has pvp enabled
14060 if (target->IsPvP())
14061 if (IsInSanctuary() && !target->IsInSanctuary())
14062 return false;
14063 }
14064 }
14065 // PvC case - player can assist creature only if has specific type flags
14066 // !target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) &&
14068 && (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14069 && !target->IsPvP())
14070 {
14071 if (Creature const* creatureTarget = target->ToCreature())
14072 return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST;
14073 }
14074 return true;
14075}
@ UNIT_STATE_UNATTACKABLE
Definition: UnitDefines.h:186
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:230
@ UNIT_FLAG_NOT_SELECTABLE
Definition: UnitDefines.h:254
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition: UnitDefines.h:232
@ REP_NEUTRAL
Definition: SharedDefines.h:183
@ CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT
Definition: SharedDefines.h:2721
@ CREATURE_TYPE_FLAG_CAN_ASSIST
Definition: SharedDefines.h:2707
@ SPELL_ATTR6_CAN_TARGET_UNTARGETABLE
Definition: SharedDefines.h:628
@ SPELL_ATTR6_IGNORE_PHASE_SHIFT
Definition: SharedDefines.h:617
@ SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC
Definition: SharedDefines.h:607
Definition: Creature.h:46
Creature * ToCreature()
Definition: Object.h:202
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition: Object.cpp:1726
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition: Unit.cpp:10055
bool HasUnitFlag(UnitFlags flags) const
Definition: Unit.h:682
bool IsInSanctuary() const
Definition: Unit.h:964
bool IsFFAPvP() const
Definition: Unit.h:966
Player * GetAffectingPlayer() const
Definition: Unit.cpp:10616

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_CAN_ASSIST, CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, GetAffectingPlayer(), Vehicle::GetBase(), GetReactionTo(), SpellInfo::HasAttribute(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), IsFFAPvP(), Player::IsGameMaster(), IsImmuneToNPC(), IsImmuneToPC(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), m_vehicle, REP_NEUTRAL, SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_STATE_UNATTACKABLE.

Referenced by SpellInfo::CheckExplicitTarget(), IsValidAssistTarget(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _IsValidAttackTarget()

bool Unit::_IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell,
WorldObject const *  obj = nullptr 
) const
13864{
13865 ASSERT(target);
13866
13867 // can't attack self
13868 if (this == target)
13869 return false;
13870
13871 // can't attack unattackable units or GMs
13872 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
13873 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
13874 return false;
13875
13876 // can't attack own vehicle or passenger
13877 if (m_vehicle)
13878 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
13879 if (!IsHostileTo(target)) // pussywizard: actually can attack own vehicle or passenger if it's hostile to us - needed for snobold in Gormok encounter
13880 return false;
13881
13882 // can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit.
13883 //Ignore stealth if target is player and unit in combat with same player
13884 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !CanSeeOrDetect(target, (bySpell && bySpell->IsAffectingArea()) || (target->IsPlayer() && target->HasStealthAura() && target->IsInCombat() && IsInCombatWith(target)))))
13885 return false;
13886
13887 // can't attack dead
13888 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
13889 return false;
13890
13891 // can't attack untargetable
13892 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
13893 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
13894 return false;
13895
13896 if (Player const* playerAttacker = ToPlayer())
13897 {
13898 if (playerAttacker->HasPlayerFlag(PLAYER_FLAGS_UBER) || playerAttacker->IsSpectator())
13899 return false;
13900 }
13901 // check flags
13903 || (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToNPC())
13904 || (!target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToNPC())
13905 || (HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToPC())
13906 // check if this is a world trigger cast - GOs are using world triggers to cast their spells, so we need to ignore their immunity flag here, this is a temp workaround, needs removal when go cast is implemented properly
13907 || ((GetEntry() != WORLD_TRIGGER && (!obj || !obj->isType(TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT))) && target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToPC()))
13908 return false;
13909
13910 // CvC case - can attack each other only when one of them is hostile
13912 return GetReactionTo(target) <= REP_HOSTILE || target->GetReactionTo(this) <= REP_HOSTILE;
13913
13914 // PvP, PvC, CvP case
13915 // can't attack friendly targets
13916 ReputationRank repThisToTarget = GetReactionTo(target);
13917 ReputationRank repTargetToThis;
13918
13919 if (repThisToTarget > REP_NEUTRAL
13920 || (repTargetToThis = target->GetReactionTo(this)) > REP_NEUTRAL)
13921 return false;
13922
13923 // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar)
13924 if (repThisToTarget == REP_NEUTRAL &&
13925 repTargetToThis <= REP_NEUTRAL)
13926 {
13927 Player* owner = GetAffectingPlayer();
13928 Unit const* const thisUnit = owner ? owner : this;
13929 if (!(target->IsPlayer() && thisUnit->IsPlayer()) &&
13930 !(target->IsCreature() && thisUnit->IsCreature()))
13931 {
13932 Player const* player = target->IsPlayer() ? target->ToPlayer() : thisUnit->ToPlayer();
13933 Unit const* creature = target->IsCreature() ? target : thisUnit;
13934
13935 if (FactionTemplateEntry const* factionTemplate = creature->GetFactionTemplateEntry())
13936 {
13937 if (!(player->GetReputationMgr().GetForcedRankIfAny(factionTemplate)))
13938 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplate->faction))
13939 if (FactionState const* repState = player->GetReputationMgr().GetState(factionEntry))
13940 if (!(repState->Flags & FACTION_FLAG_AT_WAR))
13941 return false;
13942 }
13943 }
13944 }
13945
13946 Creature const* creatureAttacker = ToCreature();
13947 if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)
13948 return false;
13949
13950 Player const* playerAffectingAttacker = HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? GetAffectingPlayer() : nullptr;
13951 Player const* playerAffectingTarget = target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? target->GetAffectingPlayer() : nullptr;
13952
13953 // check duel - before sanctuary checks
13954 if (playerAffectingAttacker && playerAffectingTarget)
13955 if (playerAffectingAttacker->duel && playerAffectingAttacker->duel->Opponent == playerAffectingTarget && playerAffectingAttacker->duel->State == DUEL_STATE_IN_PROGRESS)
13956 return true;
13957
13958 // PvP case - can't attack when attacker or target are in sanctuary
13959 // however, 13850 client doesn't allow to attack when one of the unit's has sanctuary flag and is pvp
13960 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && (target->IsInSanctuary() || IsInSanctuary()))
13961 return false;
13962
13963 // additional checks - only PvP case
13964 if (playerAffectingAttacker && playerAffectingTarget)
13965 {
13966 if (!IsPvP() && bySpell && bySpell->IsAffectingArea() && !bySpell->HasAttribute(SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK))
13967 return false;
13968
13969 if (target->IsPvP())
13970 return true;
13971
13972 if (IsFFAPvP() && target->IsFFAPvP())
13973 return true;
13974
13976 }
13977 return true;
13978}
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
@ DUEL_STATE_IN_PROGRESS
Definition: Player.h:372
@ PLAYER_FLAGS_UBER
Definition: Player.h:493
#define WORLD_TRIGGER
Definition: Unit.h:37
@ UNIT_BYTE2_FLAG_UNK1
Definition: UnitDefines.h:116
@ UNIT_FLAG_TAXI_FLIGHT
Definition: UnitDefines.h:249
@ UNIT_FLAG_NON_ATTACKABLE_2
Definition: UnitDefines.h:245
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition: UnitDefines.h:236
@ UNIT_FIELD_BYTES_2
Definition: UpdateFields.h:161
@ TYPEMASK_DYNAMICOBJECT
Definition: ObjectGuid.h:52
@ TYPEMASK_GAMEOBJECT
Definition: ObjectGuid.h:51
@ SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK
Definition: SharedDefines.h:573
ReputationRank
Definition: SharedDefines.h:179
@ REP_HOSTILE
Definition: SharedDefines.h:181
@ FACTION_FLAG_AT_WAR
Definition: DBCEnums.h:308
CreatureTemplate const * GetCreatureTemplate() const
Definition: Creature.h:208
uint32 type_flags
Definition: CreatureData.h:224
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition: Object.cpp:949
ReputationMgr & GetReputationMgr()
Definition: Player.h:2107
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition: Unit.cpp:10025
bool IsPvP() const
Definition: Unit.h:965
bool IsInCombatWith(Unit const *who) const
Definition: Unit.cpp:21025
bool IsImmuneToNPC() const
Definition: Unit.h:815
bool IsHostileTo(Unit const *unit) const
Definition: Unit.cpp:10227
bool IsImmuneToPC() const
Definition: Unit.h:813
Definition: ReputationMgr.h:42
FactionState const * GetState(FactionEntry const *factionEntry) const
Definition: ReputationMgr.h:82
ReputationRank const * GetForcedRankIfAny(FactionTemplateEntry const *factionTemplateEntry) const
Definition: ReputationMgr.h:107
Definition: DBCStructure.h:906
Definition: DBCStructure.h:938

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_FLAG_AT_WAR, GetAffectingPlayer(), Vehicle::GetBase(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetReactionTo(), Player::GetReputationMgr(), ReputationMgr::GetState(), SpellInfo::HasAttribute(), Object::HasByteFlag(), HasStealthAura(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), Object::IsCreature(), IsFFAPvP(), Player::IsGameMaster(), IsHostileTo(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsInCombatWith(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), Object::isType(), m_vehicle, PLAYER_FLAGS_UBER, REP_HOSTILE, REP_NEUTRAL, sFactionStore, SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), CreatureTemplate::type_flags, TYPEMASK_DYNAMICOBJECT, TYPEMASK_GAMEOBJECT, UNIT_BYTE2_FLAG_UNK1, UNIT_FIELD_BYTES_2, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NON_ATTACKABLE_2, UNIT_FLAG_NOT_ATTACKABLE_1, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_TAXI_FLIGHT, UNIT_STATE_UNATTACKABLE, and WORLD_TRIGGER.

Referenced by SpellInfo::CheckExplicitTarget(), Spell::DoSpellHitOnUnit(), GetMagicHitRedirectTarget(), GetMeleeHitRedirectTarget(), IsValidAttackTarget(), Acore::AnyAoETargetUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _RegisterAuraEffect()

void Unit::_RegisterAuraEffect ( AuraEffect aurEff,
bool  apply 
)
4697{
4698 if (apply)
4699 m_modAuras[aurEff->GetAuraType()].push_back(aurEff);
4700 else
4701 m_modAuras[aurEff->GetAuraType()].remove(aurEff);
4702}
AuraEffectList m_modAuras[TOTAL_AURAS]
Definition: Unit.h:1890
AuraType GetAuraType() const
Definition: SpellAuraEffects.cpp:447

References AuraEffect::GetAuraType(), and m_modAuras.

Referenced by AuraEffect::HandleEffect().

◆ _RegisterDynObject()

void Unit::_RegisterDynObject ( DynamicObject dynObj)
6119{
6120 m_dynObj.push_back(dynObj);
6121}

References m_dynObj.

Referenced by DynamicObject::BindToCaster().

◆ _RemoveAllAuraStatMods()

void Unit::_RemoveAllAuraStatMods ( )
5483{
5484 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5485 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, false);
5486}

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_RemoveAllStatBonuses().

◆ _removeAttacker()

void Unit::_removeAttacker ( Unit pAttacker)
inlineprivate
Note
: Call only in Unit::Attack()
1949{ m_attackers.erase(pAttacker); }

References m_attackers.

Referenced by Attack(), and AttackStop().

◆ _RemoveNoStackAuraApplicationsDueToAura()

void Unit::_RemoveNoStackAuraApplicationsDueToAura ( Aura aura)

◆ _RemoveNoStackAurasDueToAura()

void Unit::_RemoveNoStackAurasDueToAura ( Aura aura)
4668{
4669 //SpellInfo const* spellProto = aura->GetSpellInfo();
4670
4671 // passive spell special case (only non stackable with ranks)
4672
4673 // xinef: this check makes caster to have 2 area auras thanks to spec switch
4674 // if (spellProto->IsPassiveStackableWithRanks())
4675 // return;
4676
4677 bool remove = false;
4678 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
4679 {
4680 if (remove)
4681 {
4682 remove = false;
4683 i = m_appliedAuras.begin();
4684 }
4685
4686 if (aura->CanStackWith(i->second->GetBase(), true))
4687 continue;
4688
4690 if (i == m_appliedAuras.end())
4691 break;
4692 remove = true;
4693 }
4694}
@ AURA_REMOVE_BY_DEFAULT
Definition: SpellAuraDefines.h:392
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4776
bool CanStackWith(Aura const *checkAura, bool remove) const
Definition: SpellAuras.cpp:2021

References AURA_REMOVE_BY_DEFAULT, Aura::CanStackWith(), m_appliedAuras, and RemoveAura().

Referenced by _AddAura(), and _ApplyAura().

◆ _TryStackingOrRefreshingExistingAura()

Aura * Unit::_TryStackingOrRefreshingExistingAura ( SpellInfo const *  newAura,
uint8  effMask,
Unit caster,
int32 baseAmount = nullptr,
Item castItem = nullptr,
ObjectGuid  casterGUID = ObjectGuid::Empty,
bool  periodicReset = false 
)
4355{
4356 ASSERT(casterGUID || caster);
4357 if (!casterGUID)
4358 casterGUID = caster->GetGUID();
4359
4360 // Xinef: Hax for mixology, best solution qq
4361 if (sSpellMgr->GetSpellGroup(newAura->Id) == 1)
4362 return nullptr;
4363
4364 // passive and Incanter's Absorption and auras with different type can stack with themselves any number of times
4365 if (!newAura->IsMultiSlotAura())
4366 {
4367 // check if cast item changed
4368 ObjectGuid castItemGUID;
4369 if (castItem)
4370 castItemGUID = castItem->GetGUID();
4371
4372 // find current aura from spell and change it's stackamount, or refresh it's duration
4373 if (Aura* foundAura = GetOwnedAura(newAura->Id, newAura->HasAttribute(SPELL_ATTR0_CU_SINGLE_AURA_STACK) ? ObjectGuid::Empty : casterGUID, newAura->HasAttribute(SPELL_ATTR0_CU_ENCHANT_PROC) ? castItemGUID : ObjectGuid::Empty, 0))
4374 {
4375 // effect masks do not match
4376 // extremely rare case
4377 // let's just recreate aura
4378 if (effMask != foundAura->GetEffectMask())
4379 return nullptr;
4380
4381 // update basepoints with new values - effect amount will be recalculated in ModStackAmount
4382 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4383 {
4384 if (!foundAura->HasEffect(i))
4385 continue;
4386
4387 int bp;
4388 if (baseAmount)
4389 bp = *(baseAmount + i);
4390 else
4391 bp = foundAura->GetSpellInfo()->Effects[i].BasePoints;
4392
4393 int32* oldBP = const_cast<int32*>(&(foundAura->GetEffect(i)->m_baseAmount));
4394 *oldBP = bp;
4395 }
4396
4397 // correct cast item guid if needed
4398 if (castItemGUID != foundAura->GetCastItemGUID())
4399 {
4400 ObjectGuid* oldGUID = const_cast<ObjectGuid*>(&foundAura->m_castItemGuid);
4401 *oldGUID = castItemGUID;
4402 }
4403
4404 // try to increase stack amount
4405 foundAura->ModStackAmount(1, AURA_REMOVE_BY_DEFAULT, periodicReset);
4406 sScriptMgr->OnAuraApply(this, foundAura);
4407 return foundAura;
4408 }
4409 }
4410
4411 return nullptr;
4412}
std::int32_t int32
Definition: Define.h:103
@ SPELL_ATTR0_CU_ENCHANT_PROC
Definition: SpellInfo.h:176
@ SPELL_ATTR0_CU_SINGLE_AURA_STACK
Definition: SpellInfo.h:198
#define sSpellMgr
Definition: SpellMgr.h:825
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:109
Definition: ObjectGuid.h:118
static ObjectGuid const Empty
Definition: ObjectGuid.h:120
Aura * GetOwnedAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
Definition: Unit.cpp:4760

References ASSERT, AURA_REMOVE_BY_DEFAULT, ObjectGuid::Empty, Object::GetGUID(), GetOwnedAura(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsMultiSlotAura(), MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_ENCHANT_PROC, SPELL_ATTR0_CU_SINGLE_AURA_STACK, sScriptMgr, and sSpellMgr.

Referenced by Aura::TryRefreshStackOrCreate().

◆ _UnapplyAura() [1/2]

void Unit::_UnapplyAura ( AuraApplication aurApp,
AuraRemoveMode  removeMode 
)
4647{
4648 // aura can be removed from unit only if it's applied on it, shouldn't happen
4649 ASSERT(aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) == aurApp);
4650
4651 uint32 spellId = aurApp->GetBase()->GetId();
4652 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4653
4654 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4655 {
4656 if (iter->second == aurApp)
4657 {
4658 _UnapplyAura(iter, removeMode);
4659 return;
4660 }
4661 else
4662 ++iter;
4663 }
4664 ABORT();
4665}
#define ABORT
Definition: Errors.h:76
std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
Definition: Unit.h:641
void _UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
Definition: Unit.cpp:4551

References _UnapplyAura(), ABORT, ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), and m_appliedAuras.

◆ _UnapplyAura() [2/2]

void Unit::_UnapplyAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  removeMode 
)
4552{
4553 AuraApplication* aurApp = i->second;
4554 ASSERT(aurApp);
4555 ASSERT(!aurApp->GetRemoveMode());
4556 ASSERT(aurApp->GetTarget() == this);
4557
4558 aurApp->SetRemoveMode(removeMode);
4559 Aura* aura = aurApp->GetBase();
4560 LOG_DEBUG("spells.aura", "Aura {} now is remove mode {}", aura->GetId(), removeMode);
4561
4562 // dead loop is killing the server probably
4563 ASSERT(m_removedAurasCount < 0xFFFFFFFF);
4564
4566
4567 Unit* caster = aura->GetCaster();
4568
4569 // Remove all pointers from lists here to prevent possible pointer invalidation on spellcast/auraapply/auraremove
4570 m_appliedAuras.erase(i);
4571
4572 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4573 // xinef: event if it gets removed, it will be reapplied in a second
4574 if (aura->GetSpellInfo()->AuraInterruptFlags && this == aura->GetOwner())
4575 {
4576 m_interruptableAuras.remove(aurApp);
4578 }
4579
4580 bool auraStateFound = false;
4581 AuraStateType auraState = aura->GetSpellInfo()->GetAuraState();
4582 if (auraState)
4583 {
4584 bool canBreak = false;
4585 // Get mask of all aurastates from remaining auras
4586 for (AuraStateAurasMap::iterator itr = m_auraStateAuras.lower_bound(auraState); itr != m_auraStateAuras.upper_bound(auraState) && !(auraStateFound && canBreak);)
4587 {
4588 if (itr->second == aurApp)
4589 {
4590 m_auraStateAuras.erase(itr);
4591 itr = m_auraStateAuras.lower_bound(auraState);
4592 canBreak = true;
4593 continue;
4594 }
4595 auraStateFound = true;
4596 ++itr;
4597 }
4598 }
4599
4600 aurApp->_Remove();
4601 aura->_UnapplyForTarget(this, caster, aurApp);
4602
4603 // remove effects of the spell - needs to be done after removing aura from lists
4604 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4605 {
4606 if (aurApp->HasEffect(itr))
4607 aurApp->_HandleEffect(itr, false);
4608 }
4609
4610 // all effect mustn't be applied
4611 ASSERT(!aurApp->GetEffectMask());
4612
4613 // Remove totem at next update if totem loses its aura
4614 if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE && IsTotem() && GetGUID() == aura->GetCasterGUID())
4615 {
4616 if (ToTotem()->GetSpell() == aura->GetId() && ToTotem()->GetTotemType() == TOTEM_PASSIVE)
4617 ToTotem()->setDeathState(DeathState::JustDied);
4618 }
4619
4620 // Remove aurastates only if needed and were not found
4621 if (auraState)
4622 {
4623 if (!auraStateFound)
4624 ModifyAuraState(auraState, false);
4625 else
4626 {
4627 // update for casters, some shouldn't 'see' the aura state
4628 uint32 aStateMask = (1 << (auraState - 1));
4629 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) != 0)
4631 }
4632 }
4633
4634 aura->HandleAuraSpecificMods(aurApp, caster, false, false);
4635
4636 // only way correctly remove all auras from list
4637 //if (removedAuras != m_removedAurasCount) new aura may be added
4638 i = m_appliedAuras.begin();
4639
4640 sScriptMgr->OnAuraRemove(this, aurApp, removeMode);
4641
4642 if (this->ToCreature() && this->ToCreature()->IsAIEnabled)
4643 this->ToCreature()->AI()->OnAuraRemove(aurApp, removeMode);
4644}
@ AURA_REMOVE_BY_EXPIRE
Definition: SpellAuraDefines.h:395
@ TOTEM_PASSIVE
Definition: Totem.h:25
virtual void OnAuraRemove(AuraApplication *, AuraRemoveMode)
Definition: CreatureAI.h:223
CreatureAI * AI() const
Definition: Creature.h:143
void setDeathState(DeathState s, bool despawn=false) override
A creature can be in 4 different states: Alive, JustDied, Corpse, and JustRespawned....
Definition: TemporarySummon.cpp:395
Totem * ToTotem()
Definition: Unit.h:1729
void UpdateInterruptMask()
Definition: Unit.cpp:754
bool IsTotem() const
Definition: Unit.h:712
Unit * GetTarget() const
Definition: SpellAuras.h:61
void SetRemoveMode(AuraRemoveMode mode)
Definition: SpellAuras.h:72
void _Remove()
Definition: SpellAuras.cpp:94
bool HasEffect(uint8 effect) const
Definition: SpellAuras.h:67
virtual void _UnapplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition: SpellAuras.cpp:515

References AuraApplication::_HandleEffect(), AuraApplication::_Remove(), Aura::_UnapplyForTarget(), Creature::AI(), ASSERT, AURA_REMOVE_BY_EXPIRE, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), Aura::GetCasterGUID(), AuraApplication::GetEffectMask(), Object::GetGUID(), Aura::GetId(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), AuraApplication::GetTarget(), Aura::HandleAuraSpecificMods(), AuraApplication::HasEffect(), IsAIEnabled, IsTotem(), LOG_DEBUG, m_appliedAuras, m_auraStateAuras, m_interruptableAuras, m_removedAurasCount, MAX_SPELL_EFFECTS, ModifyAuraState(), CreatureAI::OnAuraRemove(), PER_CASTER_AURA_STATE_MASK, Minion::setDeathState(), AuraApplication::SetRemoveMode(), sScriptMgr, Object::ToCreature(), TOTEM_PASSIVE, ToTotem(), UNIT_FIELD_AURASTATE, and UpdateInterruptMask().

Referenced by Aura::_Remove(), _UnapplyAura(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAura(), and RemoveEvadeAuras().

◆ _UnregisterDynObject()

void Unit::_UnregisterDynObject ( DynamicObject dynObj)
6124{
6125 m_dynObj.remove(dynObj);
6126}

References m_dynObj.

Referenced by DynamicObject::UnbindFromCaster().

◆ _UpdateAutoRepeatSpell()

void Unit::_UpdateAutoRepeatSpell ( )
protected
3903{
3904 SpellInfo const* spellProto = nullptr;
3906 {
3908 }
3909
3910 if (!spellProto)
3911 {
3912 return;
3913 }
3914
3915 static uint32 const HUNTER_AUTOSHOOT = 75;
3916
3917 // Check "realtime" interrupts
3918 if ((IsPlayer() && ToPlayer()->isMoving()) || IsNonMeleeSpellCast(false, false, true, spellProto->Id == HUNTER_AUTOSHOOT))
3919 {
3920 // cancel wand shoot
3921 if (spellProto->Id != HUNTER_AUTOSHOOT)
3923 m_AutoRepeatFirstCast = true;
3924 return;
3925 }
3926
3928 {
3930 }
3931
3932 m_AutoRepeatFirstCast = false;
3933
3934 // Check for ranged attack timer
3936 {
3938 if (result != SPELL_CAST_OK)
3939 {
3940 if (spellProto->Id != HUNTER_AUTOSHOOT)
3941 {
3943 }
3944
3945 return;
3946 }
3947
3948 // We want to shoot
3949 Spell* spell = new Spell(this, spellProto, TRIGGERED_FULL_MASK);
3950 spell->prepare(&(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_targets));
3951
3952 // Reset attack
3954 }
3955}
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition: SpellDefines.h:147
@ CURRENT_AUTOREPEAT_SPELL
Definition: Unit.h:540
SpellCastResult
Definition: SharedDefines.h:948
@ SPELL_CAST_OK
Definition: SharedDefines.h:1138
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4060
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition: Unit.cpp:4099
void setAttackTimer(WeaponAttackType type, int32 time)
Definition: Unit.h:763
bool isMoving() const
Definition: Unit.h:1710
int32 getAttackTimer(WeaponAttackType type) const
Definition: Unit.h:765
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition: Unit.h:766
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition: Unit.cpp:642
Definition: Spell.h:284
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition: Spell.cpp:3475
SpellCastResult CheckCast(bool strict)
Definition: Spell.cpp:5653
SpellInfo const *const m_spellInfo
Definition: Spell.h:520

References Spell::CheckCast(), CURRENT_AUTOREPEAT_SPELL, getAttackTimer(), SpellInfo::Id, InterruptSpell(), isAttackReady(), isMoving(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_spellInfo, Spell::prepare(), RANGED_ATTACK, resetAttackTimer(), setAttackTimer(), SPELL_CAST_OK, Object::ToPlayer(), and TRIGGERED_FULL_MASK.

Referenced by _UpdateSpells().

◆ _UpdateSpells()

void Unit::_UpdateSpells ( uint32  time)
protected
3845{
3848
3849 // remove finished spells from current pointers
3850 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
3851 {
3852 if (m_currentSpells[i] && m_currentSpells[i]->getState() == SPELL_STATE_FINISHED)
3853 {
3855 m_currentSpells[i] = nullptr; // remove pointer
3856 }
3857 }
3858
3859 // m_auraUpdateIterator can be updated in indirect called code at aura remove to skip next planned to update but removed auras
3861 {
3862 Aura* i_aura = m_auraUpdateIterator->second;
3863 ++m_auraUpdateIterator; // need shift to next for allow update if need into aura update
3864 i_aura->UpdateOwner(time, this);
3865 }
3866
3867 // remove expired auras - do that after updates(used in scripts?)
3868 for (AuraMap::iterator i = m_ownedAuras.begin(); i != m_ownedAuras.end();)
3869 {
3870 if (i->second->IsExpired())
3872 else if (i->second->GetSpellInfo()->IsChanneled() && i->second->GetCasterGUID() != GetGUID() && !ObjectAccessor::GetWorldObject(*this, i->second->GetCasterGUID()))
3873 RemoveOwnedAura(i, AURA_REMOVE_BY_CANCEL); // remove channeled auras when caster is not on the same map
3874 else
3875 ++i;
3876 }
3877
3878 for (VisibleAuraMap::iterator itr = m_visibleAuras.begin(); itr != m_visibleAuras.end(); ++itr)
3879 if (itr->second->IsNeedClientUpdate())
3880 itr->second->ClientUpdate();
3881
3883
3884 if (!m_gameObj.empty())
3885 {
3886 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
3887 {
3888 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
3889 if (!go->isSpawned())
3890 {
3891 go->SetOwnerGUID(ObjectGuid::Empty);
3892 go->SetRespawnTime(0);
3893 go->Delete();
3894 m_gameObj.erase(itr++);
3895 continue;
3896 }
3897 ++itr;
3898 }
3899 }
3900}
@ AURA_REMOVE_BY_CANCEL
Definition: SpellAuraDefines.h:393
@ SPELL_STATE_FINISHED
Definition: Spell.h:226
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:184
WorldObject * GetWorldObject(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:115
Definition: GameObject.h:121
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4705
void _UpdateAutoRepeatSpell()
Definition: Unit.cpp:3902
VisibleAuraMap m_visibleAuras
Definition: Unit.h:1899
void UpdateOwner(uint32 diff, WorldObject *owner)
Definition: SpellAuras.cpp:756

References _DeleteRemovedAuras(), _UpdateAutoRepeatSpell(), AURA_REMOVE_BY_CANCEL, AURA_REMOVE_BY_EXPIRE, CURRENT_AUTOREPEAT_SPELL, CURRENT_MAX_SPELL, ObjectGuid::Empty, ObjectAccessor::GetGameObject(), Object::GetGUID(), ObjectAccessor::GetWorldObject(), m_auraUpdateIterator, m_currentSpells, m_gameObj, m_ownedAuras, m_visibleAuras, RemoveOwnedAura(), Spell::SetReferencedFromCurrent(), SPELL_STATE_FINISHED, and Aura::UpdateOwner().

Referenced by Update().

◆ AddAura() [1/2]

Aura * Unit::AddAura ( SpellInfo const *  spellInfo,
uint8  effMask,
Unit target 
)
18866{
18867 if (!spellInfo)
18868 return nullptr;
18869
18870 if (target->IsImmunedToSpell(spellInfo))
18871 return nullptr;
18872
18873 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
18874 {
18875 if (!(effMask & (1 << i)))
18876 continue;
18877 if (target->IsImmunedToSpellEffect(spellInfo, i))
18878 effMask &= ~(1 << i);
18879 }
18880
18881 if (Aura* aura = Aura::TryRefreshStackOrCreate(spellInfo, effMask, target, this))
18882 {
18883 aura->ApplyForTargets();
18884 return aura;
18885 }
18886 return nullptr;
18887}
virtual bool IsImmunedToSpellEffect(SpellInfo const *spellInfo, uint32 index) const
Definition: Unit.cpp:12992
virtual bool IsImmunedToSpell(SpellInfo const *spellInfo, Spell const *spell=nullptr)
Definition: Unit.cpp:12902
static Aura * TryRefreshStackOrCreate(SpellInfo const *spellproto, uint8 tryEffMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool *refresh=nullptr, bool periodicReset=false)
Definition: SpellAuras.cpp:326

References Aura::ApplyForTargets(), IsImmunedToSpell(), IsImmunedToSpellEffect(), MAX_SPELL_EFFECTS, and Aura::TryRefreshStackOrCreate().

◆ AddAura() [2/2]

Aura * Unit::AddAura ( uint32  spellId,
Unit target 
)
18851{
18852 if (!target)
18853 return nullptr;
18854
18855 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
18856 if (!spellInfo)
18857 return nullptr;
18858
18859 if (!target->IsAlive() && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_DEAD_TARGET))
18860 return nullptr;
18861
18862 return AddAura(spellInfo, MAX_EFFECT_MASK, target);
18863}
@ SPELL_ATTR2_ALLOW_DEAD_TARGET
Definition: SharedDefines.h:456
@ SPELL_ATTR0_PASSIVE
Definition: SharedDefines.h:388
#define MAX_EFFECT_MASK
Definition: DBCStructure.h:1637
Aura * AddAura(uint32 spellId, Unit *target)
Definition: Unit.cpp:18850
bool HasAttribute(SpellAttr0 attribute) const
Definition: SpellInfo.h:415

References AddAura(), SpellInfo::HasAttribute(), IsAlive(), MAX_EFFECT_MASK, SPELL_ATTR0_PASSIVE, SPELL_ATTR2_ALLOW_DEAD_TARGET, and sSpellMgr.

Referenced by AddAura(), boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::AttackStart(), boss_anzu::boss_anzu(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoTriggersOnSpellHit(), npc_anubisath_sentinel::aqsentinelAI::GainSentinelAbility(), AuraEffect::HandleAuraDummy(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterAdd(), gm_commandscript::HandleGMVisibleCommand(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_transitus_shield_beam_aura::HandleOnEffectApply(), npc_pet_dk_dancing_rune_weapon::npc_pet_dk_dancing_rune_weaponAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Guardian::InitStatsForLevel(), boss_gahzranka::boss_gahzrankaAI::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_dalaran_warrior::npc_dalaran_warriorAI::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Creature::LoadCreaturesAddon(), npc_brew_bubble::MoveInLineOfSight(), npc_pet_gen_plump_turkey::MovementInform(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_empowered_aura::OnPeriodic(), instance_stratholme::instance_stratholme_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerEnterZone(), AreaTrigger_at_area_52_entrance::OnTrigger(), Player::ProcessDelayedOperations(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_corrupted_totem::Reset(), npc_troll_volunteer::npc_troll_volunteerAI::Reset(), npc_vengeful_shade::npc_vengeful_shadeAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_magus_telestra::boss_magus_telestraAI::Reset(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_archavon::boss_archavonAI::Reset(), boss_emalon::boss_emalonAI::Reset(), boss_koralon::boss_koralonAI::Reset(), boss_toravon::boss_toravonAI::Reset(), npc_dalaran_mage::npc_dalaran_mageAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), npc_pet_pri_shadowfiend::Reset(), Player::SendInitialPacketsAfterAddToMap(), npc_corrupted_totem::SetAura(), SetAuraStack(), Player::SetGMVisible(), Player::SetIsSpectator(), npc_artorius::npc_artoriusAI::SpellHit(), npc_simone::npc_simoneAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHitTarget(), boss_netherspite::SwitchToPortalPhase(), boss_gyth::boss_gythAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), boss_netherspite::UpdatePortals(), and npc_emily::npc_emilyAI::WaypointReached().

◆ AddComboPointHolder()

void Unit::AddComboPointHolder ( Unit unit)
inline
1652{ m_ComboPointHolders.insert(unit); }
std::unordered_set< Unit * > m_ComboPointHolders
Definition: Unit.h:1965

References m_ComboPointHolders.

Referenced by AddComboPoints().

◆ AddComboPoints() [1/2]

void Unit::AddComboPoints ( int8  count)
inline
1648{ AddComboPoints(nullptr, count); }
void AddComboPoints(Unit *target, int8 count)
Definition: Unit.cpp:16825

References AddComboPoints().

Referenced by AddComboPoints().

◆ AddComboPoints() [2/2]

void Unit::AddComboPoints ( Unit target,
int8  count 
)
16826{
16827 if (!count)
16828 {
16829 return;
16830 }
16831
16832 if (target && target != m_comboTarget)
16833 {
16834 if (m_comboTarget)
16835 {
16837 }
16838
16839 m_comboTarget = target;
16840 m_comboPoints = count;
16841 target->AddComboPointHolder(this);
16842 }
16843 else
16844 {
16845 m_comboPoints = std::max<int8>(std::min<int8>(m_comboPoints + count, 5), 0);
16846 }
16847
16849}
void SendComboPoints()
Definition: Unit.cpp:16868
void AddComboPointHolder(Unit *unit)
Definition: Unit.h:1652
void RemoveComboPointHolder(Unit *unit)
Definition: Unit.h:1653

References AddComboPointHolder(), m_comboPoints, m_comboTarget, RemoveComboPointHolder(), and SendComboPoints().

Referenced by Spell::_handle_finish_phase(), AuraEffect::HandleAuraRetainComboPoints(), and ProcDamageAndSpellFor().

◆ AddExtraAttacks()

void Unit::AddExtraAttacks ( uint32  count)
2766{
2768 if (!targetGUID)
2769 {
2770 if (ObjectGuid selection = GetTarget())
2771 {
2772 targetGUID = selection; // Spell was cast directly (not triggered by aura)
2773 }
2774 else
2775 return;
2776 }
2777
2778 extraAttacksTargets[targetGUID] += count;
2779}
std::unordered_map< ObjectGuid, uint32 > extraAttacksTargets
Definition: Unit.h:1976
ObjectGuid _lastDamagedTargetGuid
Definition: Unit.h:1977
ObjectGuid GetTarget() const
Definition: Unit.h:1756

References _lastDamagedTargetGuid, extraAttacksTargets, and GetTarget().

Referenced by Spell::EffectAddExtraAttacks().

◆ AddExtraUnitMovementFlag()

void Unit::AddExtraUnitMovementFlag ( uint16  f)
inline
1631{ m_movementInfo.flags2 |= f; }
uint16 flags2
Definition: Object.h:280
MovementInfo m_movementInfo
Definition: Object.h:609

References MovementInfo::flags2, and WorldObject::m_movementInfo.

Referenced by Vehicle::InitMovementInfoForBase().

◆ addFollower()

void Unit::addFollower ( FollowerReference pRef)
inline
void insertFirst(LinkedListElement *pElem)
Definition: LinkedList.h:105
FollowerRefMgr m_FollowingRefMgr
Definition: Unit.h:1961

References LinkedListHead::insertFirst(), and m_FollowingRefMgr.

Referenced by FollowerReference::targetObjectBuildLink().

◆ AddGameObject()

void Unit::AddGameObject ( GameObject gameObj)
6180{
6181 if (!gameObj || gameObj->GetOwnerGUID())
6182 return;
6183
6184 m_gameObj.push_back(gameObj->GetGUID());
6185 gameObj->SetOwnerGUID(GetGUID());
6186
6187 if (IsPlayer() && gameObj->GetSpellId())
6188 {
6189 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(gameObj->GetSpellId());
6190 // Need disable spell use for owner
6191 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6192 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6193 ToPlayer()->AddSpellAndCategoryCooldowns(createBySpell, 0, nullptr, true);
6194 }
6195}
uint32 GetSpellId() const
Definition: GameObject.h:182
void SetOwnerGUID(ObjectGuid owner)
Definition: GameObject.h:164
ObjectGuid GetOwnerGUID() const
Definition: GameObject.h:174
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition: Player.cpp:10907
bool IsCooldownStartedOnEvent() const
Definition: SpellInfo.cpp:1211

References Player::AddSpellAndCategoryCooldowns(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, GameObject::SetOwnerGUID(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::EffectDuel(), Spell::EffectSummonObject(), Spell::EffectTransmitted(), npc_midsummer_bonfire::Ignite(), and WorldObject::SummonGameObject().

◆ addHatedBy()

void Unit::addHatedBy ( HostileReference pHostileReference)
inline

◆ AddInterruptMask()

void Unit::AddInterruptMask ( uint32  mask)
inline
1516{ m_interruptMask |= mask; }

References m_interruptMask.

Referenced by _CreateAuraApplication(), and Spell::handle_immediate().

◆ AddPetAura()

void Unit::AddPetAura ( PetAura const *  petSpell)
17285{
17286 if (!IsPlayer())
17287 return;
17288
17289 m_petAuras.insert(petSpell);
17290 if (Pet* pet = ToPlayer()->GetPet())
17291 pet->CastPetAura(petSpell);
17292 else if (Unit* charm = GetCharm())
17293 charm->CastPetAura(petSpell);
17294}
Pet * GetPet(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:215
Definition: Pet.h:41
Unit * GetCharm() const
Definition: Unit.cpp:10657
PetAuraSet m_petAuras
Definition: Unit.h:1816

References GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Spell::EffectDummy(), and AuraEffect::HandleAuraDummy().

◆ AddPlayerToVision()

void Unit::AddPlayerToVision ( Player player)
11156{
11157 if (m_sharedVision.empty())
11158 {
11159 setActive(true);
11160 SetWorldObject(true);
11161 }
11162 m_sharedVision.push_back(player);
11163 player->m_isInSharedVisionOf.insert(this);
11164}
void SetWorldObject(bool apply)
Definition: Object.cpp:1066
void setActive(bool isActiveObject)
Definition: Object.cpp:1085

References Player::m_isInSharedVisionOf, m_sharedVision, WorldObject::setActive(), and WorldObject::SetWorldObject().

◆ AddPointedBy()

void Unit::AddPointedBy ( SafeUnitPointer sup)
inline
1733{ SafeUnitPointerSet.insert(sup); }
std::set< SafeUnitPointer * > SafeUnitPointerSet
Definition: Unit.h:1825

References SafeUnitPointerSet.

Referenced by SafeUnitPointer::SetPointedTo().

◆ AddSpellCooldown()

virtual void Unit::AddSpellCooldown ( uint32  ,
uint32  ,
uint32  ,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
inlinevirtual

◆ AddThreat()

void Unit::AddThreat ( Unit victim,
float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  threatSpell = nullptr 
)
14640{
14641 // Only mobs can manage threat lists
14643 {
14644 m_ThreatMgr.AddThreat(victim, fThreat, schoolMask, threatSpell);
14645 }
14646}
@ UNIT_STATE_EVADE
Definition: UnitDefines.h:170
void AddThreat(Unit *victim, float threat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition: ThreatMgr.cpp:436
bool HasUnitState(const uint32 f) const
Definition: Unit.h:673
bool CanHaveThreatList(bool skipAliveCheck=false) const
Definition: Unit.cpp:14600

References ThreatMgr::AddThreat(), CanHaveThreatList(), HasUnitState(), m_ThreatMgr, and UNIT_STATE_EVADE.

Referenced by Attack(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alyson_antille::boss_alyson_antilleAI::AttackStart(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::AttackStart(), npc_capernian::AttackStart(), npc_dirt_mound::ChaseNewTarget(), boss_buru::ChaseNewVictim(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DamageTaken(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), DealDamage(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), CreatureAI::DoZoneInCombat(), Spell::EffectThreat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), npc_raging_flames::FixateRandomTarget(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), spell_morogrim_tidewalker_water_globule_new_target::HandleDummy(), HandleDummyAuraProc(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), AuraEffect::HandlePeriodicManaLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_the_lich_king_vile_spirit_move_target_search::HandleScript(), spell_pursue::HandleScript(), Spell::HandleThreatSpells(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_tiger_matriarch::npc_tiger_matriarchAI::IsSummonedBy(), npc_little_ooze::npc_little_oozeAI::IsSummonedBy(), npc_malchezaar_axe::JustEngagedWith(), npc_thaladred::JustEngagedWith(), boss_buru::JustEngagedWith(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), boss_curator::JustSummoned(), boss_sacrolash::boss_sacrolashAI::JustSummoned(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustSummoned(), npc_akama_illidan::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), boss_shade_of_akama::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_mage_mirror_image::MySelectNextTarget(), SmartScript::ProcessAction(), RemoveCharmedBy(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::Reset(), boss_dalronn_the_controller::boss_dalronn_the_controllerAI::Reset(), npc_tainted_elemental::Reset(), npc_pet_hunter_snake_trap::Reset(), boss_romulo::ScheduleCombat(), boss_supremus::SchedulePhase(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), brann_bronzebeard::brann_bronzebeardAI::SummonCreatures(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_kagani_nightstrike::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), and npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI().

◆ AddToWorld()

void Unit::AddToWorld ( )
overridevirtual

Reimplemented from WorldObject.

15675{
15676 if (!IsInWorld())
15677 {
15679 }
15680}
void AddToWorld() override
Definition: Object.cpp:1176

References WorldObject::AddToWorld(), and Object::IsInWorld().

Referenced by Creature::AddToWorld(), Pet::AddToWorld(), and Player::AddToWorld().

◆ AddUnitMovementFlag()

◆ AddUnitState()

void Unit::AddUnitState ( uint32  f)
inline
Todo:
: move this in Object class or move GetUInt32value here but keep consistency
672{ m_state |= f; }

References m_state.

Referenced by _ExitVehicle(), RandomMovementGenerator< T >::_setRandomLocation(), MotionTransport::AddPassenger(), Attack(), boss_prince_keleseth_icc::boss_prince_kelesethAI::boss_prince_kelesethAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::boss_prince_taldaramAI(), boss_prince_valanar_icc::boss_prince_valanarAI::boss_prince_valanarAI(), Creature::Create(), MotionTransport::CreateNPCPassenger(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), boss_nightbane::DoAction(), WaypointMovementGenerator< Creature >::DoInitialize(), RandomMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoReset(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_jindo::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), Creature::FocusTarget(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetCastSpellOpcode(), RotateMovementGenerator::Initialize(), DistractMovementGenerator::Initialize(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), Player::LoadFromDB(), boss_ayamiss::MovementInform(), boss_lady_vashj::MovementInform(), npc_pet_gen_moth::npc_pet_gen_moth(), npc_pet_gen_valkyr_guardian::npc_pet_gen_valkyr_guardian(), npc_pet_gen_wind_rider_cub::npc_pet_gen_wind_rider_cub(), npc_corrupted_totem::Reset(), boss_jedoga_shadowseeker::Reset(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), boss_hungarfen::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), SetCharmedBy(), SetContestedPvP(), SetControlled(), SetCurrentCastedSpell(), Player::setDeathState(), Player::SetIsSpectator(), boss_urom::boss_uromAI::SpellHit(), WaypointMovementGenerator< Creature >::StartMove(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), and boss_svala::boss_svalaAI::UpdateAI().

◆ AddUnitTypeMask()

void Unit::AddUnitTypeMask ( uint32  mask)
inline
678{ m_unitTypeMask |= mask; }

References m_unitTypeMask.

◆ ApplyAttackTimePercentMod()

void Unit::ApplyAttackTimePercentMod ( WeaponAttackType  att,
float  val,
bool  apply 
)
17042{
17043 float remainingTimePct = std::max((float)m_attackTimer[att], 0.0f) / (GetAttackTime(att) * m_modAttackSpeedPct[att]);
17044 if (val > 0)
17045 {
17047 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, val, !apply);
17048 }
17049 else
17050 {
17052 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, -val, apply);
17053 }
17054 m_attackTimer[att] = uint32(GetAttackTime(att) * m_modAttackSpeedPct[att] * remainingTimePct);
17055}
std::uint16_t uint16
Definition: Define.h:108
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition: Util.h:50
@ UNIT_FIELD_BASEATTACKTIME
Definition: UpdateFields.h:120
void ApplyPercentModFloatValue(uint16 index, float val, bool apply)
Definition: Object.cpp:829
uint32 GetAttackTime(WeaponAttackType att) const
Definition: Unit.h:800

References Object::ApplyPercentModFloatValue(), ApplyPercentModFloatVar(), GetAttackTime(), m_attackTimer, m_modAttackSpeedPct, and UNIT_FIELD_BASEATTACKTIME.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleAuraModRangedHaste(), AuraEffect::HandleModAttackSpeed(), AuraEffect::HandleModCombatSpeedPct(), AuraEffect::HandleModMeleeRangedSpeedPct(), AuraEffect::HandleModMeleeSpeedPct(), and AuraEffect::HandleRangedAmmoHaste().

◆ ApplyCastTimePercentMod()

void Unit::ApplyCastTimePercentMod ( float  val,
bool  apply 
)
17058{
17059 if (val > 0)
17061 else
17063}
@ UNIT_MOD_CAST_SPEED
Definition: UpdateFields.h:137

References Object::ApplyPercentModFloatValue(), and UNIT_MOD_CAST_SPEED.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleModCastingSpeed(), and AuraEffect::HandleModCombatSpeedPct().

◆ ApplyDiminishingAura()

void Unit::ApplyDiminishingAura ( DiminishingGroup  group,
bool  apply 
)
15113{
15114 // Checking for existing in the table
15115 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15116 {
15117 if (i->DRGroup != group)
15118 continue;
15119
15120 if (apply)
15121 i->stack += 1;
15122 else if (i->stack)
15123 {
15124 i->stack -= 1;
15125 // Remember time after last aura from group removed
15126 if (i->stack == 0)
15127 i->hitTime = GameTime::GetGameTimeMS().count();
15128 }
15129 break;
15130 }
15131}
Milliseconds GetGameTimeMS()
Definition: GameTime.cpp:43
Diminishing m_Diminishing
Definition: Unit.h:1957

References GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by UnitAura::_ApplyForTarget(), and UnitAura::_UnapplyForTarget().

◆ ApplyDiminishingToDuration()

float Unit::ApplyDiminishingToDuration ( DiminishingGroup  group,
int32 duration,
Unit caster,
DiminishingLevels  Level,
int32  limitduration 
)
15034{
15035 // xinef: dont apply diminish to self casts
15036 if (duration == -1 || group == DIMINISHING_NONE)
15037 return 1.0f;
15038
15039 // test pet/charm masters instead pets/charmeds
15040 Unit const* targetOwner = GetOwner();
15041 Unit const* casterOwner = caster->GetOwner();
15042
15043 // Duration of crowd control abilities on pvp target is limited by 10 sec. (2.2.0)
15044 if (limitduration > 0 && duration > limitduration)
15045 {
15046 Unit const* target = targetOwner ? targetOwner : this;
15047 Unit const* source = casterOwner ? casterOwner : caster;
15048
15049 if ((target->IsPlayer()
15051 && source->IsPlayer())
15052 duration = limitduration;
15053 }
15054
15055 float mod = 1.0f;
15056
15057 if (group == DIMINISHING_TAUNT)
15058 {
15059 if (IsCreature() && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS))
15060 {
15061 DiminishingLevels diminish = Level;
15062 switch (diminish)
15063 {
15065 break;
15067 mod = 0.65f;
15068 break;
15070 mod = 0.4225f;
15071 break;
15073 mod = 0.274625f;
15074 break;
15076 mod = 0.0f;
15077 break;
15078 default:
15079 break;
15080 }
15081 }
15082 }
15083 // Some diminishings applies to mobs too (for example, Stun)
15085 && ((targetOwner ? (targetOwner->IsPlayer()) : (IsPlayer()))
15086 || (IsCreature() && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH)))
15088 {
15089 DiminishingLevels diminish = Level;
15090 switch (diminish)
15091 {
15093 break;
15095 mod = 0.5f;
15096 break;
15098 mod = 0.25f;
15099 break;
15101 mod = 0.0f;
15102 break;
15103 default:
15104 break;
15105 }
15106 }
15107
15108 duration = int32(duration * mod);
15109 return mod;
15110}
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group)
Definition: SpellMgr.cpp:245
@ CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS
Definition: CreatureData.h:65
@ CREATURE_FLAG_EXTRA_ALL_DIMINISH
Definition: CreatureData.h:66
DiminishingLevels
Definition: Unit.h:262
@ DIMINISHING_LEVEL_3
Definition: Unit.h:265
@ DIMINISHING_LEVEL_1
Definition: Unit.h:263
@ DIMINISHING_LEVEL_4
Definition: Unit.h:267
@ DIMINISHING_LEVEL_IMMUNE
Definition: Unit.h:266
@ DIMINISHING_LEVEL_TAUNT_IMMUNE
Definition: Unit.h:268
@ DIMINISHING_LEVEL_2
Definition: Unit.h:264
@ DIMINISHING_NONE
Definition: SharedDefines.h:3258
@ DIMINISHING_TAUNT
Definition: SharedDefines.h:3276
@ DRTYPE_PLAYER
Definition: SharedDefines.h:3251
@ DRTYPE_ALL
Definition: SharedDefines.h:3252
uint32 flags_extra
Definition: CreatureData.h:247

References CREATURE_FLAG_EXTRA_ALL_DIMINISH, CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS, DIMINISHING_LEVEL_1, DIMINISHING_LEVEL_2, DIMINISHING_LEVEL_3, DIMINISHING_LEVEL_4, DIMINISHING_LEVEL_IMMUNE, DIMINISHING_LEVEL_TAUNT_IMMUNE, DIMINISHING_NONE, DIMINISHING_TAUNT, DRTYPE_ALL, DRTYPE_PLAYER, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), GetDiminishingReturnsGroupType(), GetOwner(), Object::IsCreature(), Object::IsPlayer(), and Object::ToCreature().

Referenced by Spell::DoSpellHitOnUnit().

◆ ApplyEffectModifiers()

float Unit::ApplyEffectModifiers ( SpellInfo const *  spellProto,
uint8  effect_index,
float  value 
) const
14816{
14817 if (Player* modOwner = GetSpellModOwner())
14818 {
14819 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_ALL_EFFECTS, value);
14820 switch (effect_index)
14821 {
14822 case 0:
14823 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT1, value);
14824 break;
14825 case 1:
14826 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT2, value);
14827 break;
14828 case 2:
14829 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT3, value);
14830 break;
14831 }
14832 }
14833 return value;
14834}
@ SPELLMOD_EFFECT2
Definition: SpellDefines.h:88
@ SPELLMOD_ALL_EFFECTS
Definition: SpellDefines.h:84
@ SPELLMOD_EFFECT3
Definition: SpellDefines.h:99
@ SPELLMOD_EFFECT1
Definition: SpellDefines.h:79
Player * GetSpellModOwner() const
Definition: Unit.cpp:16564

References GetSpellModOwner(), SpellInfo::Id, SPELLMOD_ALL_EFFECTS, SPELLMOD_EFFECT1, SPELLMOD_EFFECT2, and SPELLMOD_EFFECT3.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellEffectInfo::CalcValue(), and Spell::EffectSchoolDMG().

◆ ApplyResilience()

void Unit::ApplyResilience ( Unit const *  victim,
float *  crit,
int32 damage,
bool  isCrit,
CombatRating  type 
)
static
18915{
18916 // player mounted on multi-passenger mount is also classified as vehicle
18917 if (victim->IsVehicle() && !victim->IsPlayer())
18918 return;
18919
18920 Unit const* target = nullptr;
18921 if (victim->IsPlayer())
18922 target = victim;
18923 else if (victim->IsCreature())
18924 {
18925 if (Unit* owner = victim->GetOwner())
18926 if (owner->IsPlayer())
18927 target = owner;
18928 }
18929
18930 if (!target)
18931 return;
18932
18933 switch (type)
18934 {
18936 // Crit chance reduction works against nonpets
18937 if (crit)
18938 *crit -= target->GetMeleeCritChanceReduction();
18939 if (damage)
18940 {
18941 if (isCrit)
18942 *damage -= target->GetMeleeCritDamageReduction(*damage);
18943 *damage -= target->GetMeleeDamageReduction(*damage);
18944 }
18945 break;
18947 // Crit chance reduction works against nonpets
18948 if (crit)
18949 *crit -= target->GetRangedCritChanceReduction();
18950 if (damage)
18951 {
18952 if (isCrit)
18953 *damage -= target->GetRangedCritDamageReduction(*damage);
18954 *damage -= target->GetRangedDamageReduction(*damage);
18955 }
18956 break;
18958 // Crit chance reduction works against nonpets
18959 if (crit)
18960 *crit -= target->GetSpellCritChanceReduction();
18961 if (damage)
18962 {
18963 if (isCrit)
18964 *damage -= target->GetSpellCritDamageReduction(*damage);
18965 *damage -= target->GetSpellDamageReduction(*damage);
18966 }
18967 break;
18968 default:
18969 break;
18970 }
18971}
@ CR_CRIT_TAKEN_RANGED
Definition: Unit.h:232
@ CR_CRIT_TAKEN_SPELL
Definition: Unit.h:233
@ CR_CRIT_TAKEN_MELEE
Definition: Unit.h:231
float GetSpellCritChanceReduction() const
Definition: Unit.h:1029
float GetRangedCritChanceReduction() const
Definition: Unit.h:1028
uint32 GetSpellCritDamageReduction(uint32 damage) const
Definition: Unit.h:1034
float GetMeleeCritChanceReduction() const
Definition: Unit.h:1027
uint32 GetRangedDamageReduction(uint32 damage) const
Definition: Unit.h:1038
uint32 GetRangedCritDamageReduction(uint32 damage) const
Definition: Unit.h:1033
uint32 GetMeleeCritDamageReduction(uint32 damage) const
Definition: Unit.h:1032
uint32 GetSpellDamageReduction(uint32 damage) const
Definition: Unit.h:1039
uint32 GetMeleeDamageReduction(uint32 damage) const
Definition: Unit.h:1037

References CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, GetMeleeCritChanceReduction(), GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetOwner(), GetRangedCritChanceReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritChanceReduction(), GetSpellCritDamageReduction(), GetSpellDamageReduction(), Object::IsCreature(), Object::IsPlayer(), and IsVehicle().

Referenced by CalculateSpellDamageTaken(), GetUnitCriticalChance(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_valkyr_touch::spell_valkyr_touchAuraScript::PrepareAuraScript(), and SpellTakenCritChance().

◆ ApplyResistanceBuffModsMod()

void Unit::ApplyResistanceBuffModsMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline
1434{ ApplyModSignedFloatValue(positive ? static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE) + school : static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE) + + school, val, apply); }
@ UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE
Definition: UpdateFields.h:157
@ UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE
Definition: UpdateFields.h:158
void ApplyModSignedFloatValue(uint16 index, float val, bool apply)
Definition: Object.cpp:822

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, and UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE.

Referenced by AuraEffect::HandleAuraModResistance(), and AuraEffect::HandleAuraModResistanceExclusive().

◆ ApplyResistanceBuffModsPercentMod()

void Unit::ApplyResistanceBuffModsPercentMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline

◆ ApplySpellDispelImmunity()

void Unit::ApplySpellDispelImmunity ( SpellInfo const *  spellProto,
DispelType  type,
bool  apply 
)
13403{
13404 ApplySpellImmune(spellProto->Id, IMMUNITY_DISPEL, type, apply);
13405
13406 if (apply && spellProto->HasAttribute(SPELL_ATTR1_IMMUNITY_PURGES_EFFECT))
13407 {
13408 // Create dispel mask by dispel type
13409 uint32 dispelMask = SpellInfo::GetDispelMask(type);
13410 // Dispel all existing auras vs current dispel type
13412 for (AuraApplicationMap::iterator itr = auras.begin(); itr != auras.end();)
13413 {
13414 SpellInfo const* spell = itr->second->GetBase()->GetSpellInfo();
13415 if (spell->GetDispelMask() & dispelMask)
13416 {
13417 // Dispel aura
13418 RemoveAura(itr);
13419 }
13420 else
13421 ++itr;
13422 }
13423 }
13424}
@ SPELL_ATTR1_IMMUNITY_PURGES_EFFECT
Definition: SharedDefines.h:434
@ IMMUNITY_DISPEL
Definition: SharedDefines.h:1398
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition: Unit.cpp:13375
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition: Unit.h:639
AuraApplicationMap & GetAppliedAuras()
Definition: Unit.h:1331
uint32 GetDispelMask() const
Definition: SpellInfo.cpp:2040

References ApplySpellImmune(), GetAppliedAuras(), SpellInfo::GetDispelMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IMMUNITY_DISPEL, RemoveAura(), and SPELL_ATTR1_IMMUNITY_PURGES_EFFECT.

Referenced by AuraEffect::HandleAuraModDispelImmunity().

◆ ApplySpellImmune()

void Unit::ApplySpellImmune ( uint32  spellId,
uint32  op,
uint32  type,
bool  apply,
SpellImmuneBlockType  blockType = SPELL_BLOCK_TYPE_ALL 
)
13376{
13377 if (apply)
13378 {
13379 // xinef: immunities with spellId 0 are intended to be applied only once (script purposes mosty)
13380 if (spellId == 0 && std::find_if(m_spellImmune[op].begin(), m_spellImmune[op].end(), spellIdImmunityPredicate(type)) != m_spellImmune[op].end())
13381 return;
13382
13383 SpellImmune immune;
13384 immune.spellId = spellId;
13385 immune.type = type;
13386 immune.blockType = blockType;
13387 m_spellImmune[op].push_back(std::move(immune));
13388 }
13389 else
13390 {
13391 for (SpellImmuneList::iterator itr = m_spellImmune[op].begin(); itr != m_spellImmune[op].end(); ++itr)
13392 {
13393 if (itr->spellId == spellId && itr->type == type)
13394 {
13395 m_spellImmune[op].erase(itr);
13396 break;
13397 }
13398 }
13399 }
13400}
Definition: Unit.cpp:13366
Definition: SpellDefines.h:171
uint32 blockType
Definition: SpellDefines.h:176
uint32 spellId
Definition: SpellDefines.h:174
uint32 type
Definition: SpellDefines.h:175

References SpellImmune::blockType, m_spellImmune, SpellImmune::spellId, and SpellImmune::type.

Referenced by Vehicle::ApplyAllImmunities(), boss_kelidan_the_breaker::ApplyImmunities(), ApplyMechanicImmune(), ApplySpellDispelImmunity(), boss_amanitar::boss_amanitar(), boss_anubarak_trial::boss_anubarak_trialAI::boss_anubarak_trialAI(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_icehowl::boss_icehowlAI::boss_icehowlAI(), boss_sindragosa::boss_sindragosaAI::boss_sindragosaAI(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_void_reaver::boss_void_reaver(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDmgImmunity(), AuraEffect::HandleAuraModEffectImmunity(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleAuraModStateImmunity(), Aura::HandleAuraSpecificMods(), spell_q13007_iron_colossus::HandleDummy(), spell_love_in_air_perfume_immune::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_dk_anti_magic_shell_self::HandleEffectApply(), spell_dk_pet_scaling::HandleEffectApply(), spell_dru_treant_scaling::HandleEffectApply(), spell_pet_hit_expertise_scalling::HandleEffectApply(), spell_mage_pet_scaling::HandleEffectApply(), spell_pri_shadowfiend_scaling::HandleEffectApply(), spell_sha_feral_spirit_scaling::HandleEffectApply(), spell_sha_fire_elemental_scaling::HandleEffectApply(), spell_warl_infernal_scaling::HandleEffectApply(), spell_love_in_air_perfume_immune::HandleEffectRemove(), spell_dk_anti_magic_shell_self::HandleEffectRemove(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), npc_hyjal_jaina::hyjalJainaAI::hyjalJainaAI(), npc_pet_dk_army_of_the_dead::npc_pet_dk_army_of_the_deadAI::InitializeAI(), boss_hydross_the_unstable::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Player::LoadFromDB(), Creature::LoadSpellTemplateImmunity(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_target_dummy::npc_target_dummyAI::npc_target_dummyAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::npc_tournament_training_dummyAI(), npc_training_dummy::npc_training_dummyAI::npc_training_dummyAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::npc_ulduar_arachnopod_destroyerAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::npc_valkyr_shadowguardAI(), spell_yogg_saron_malady_of_the_mind_aura::OnApply(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_chesspiece::Reset(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_felblood_kaelthas::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::Reset(), npc_dark_iron_guzzler::Reset(), boss_mal_ganis::boss_mal_ganisAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_gluth::boss_gluthAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_auriaya::boss_auriayaAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_supremus::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), boss_supremus::SchedulePhase(), boss_hydross_the_unstable::SetForm(), boss_felblood_kaelthas::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), Creature::UpdateEntry(), and npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached().

◆ ApplyStatBuffMod()

void Unit::ApplyStatBuffMod ( Stats  stat,
float  val,
bool  apply 
)
inline
1441{ ApplyModSignedFloatValue((val > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), val, apply); }
@ UNIT_FIELD_POSSTAT0
Definition: UpdateFields.h:146
@ UNIT_FIELD_NEGSTAT0
Definition: UpdateFields.h:151

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::_ApplyItemBonuses(), Player::ApplyEnchantment(), and AuraEffect::HandleAuraModStat().

◆ ApplyStatPercentBuffMod()

void Unit::ApplyStatPercentBuffMod ( Stats  stat,
float  val,
bool  apply 
)
15324{
15325 if (val == -100.0f) // prevent set var to zero
15326 val = -99.99f;
15327 float var = GetStat(stat) * val / 100.0f;
15328 ApplyModSignedFloatValue((var > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), var, apply);
15329}
float GetStat(Stats stat) const
Definition: Unit.h:859

References Object::ApplyModSignedFloatValue(), GetStat(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by AuraEffect::HandleModTotalPercentStat().

◆ ApplyTotalThreatModifier()

float Unit::ApplyTotalThreatModifier ( float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
14628{
14629 if (!HasAuraType(SPELL_AURA_MOD_THREAT) || fThreat < 0)
14630 return fThreat;
14631
14632 SpellSchools school = GetFirstSchoolInMask(schoolMask);
14633
14634 return fThreat * m_threatModifier[school];
14635}
@ SPELL_AURA_MOD_THREAT
Definition: SpellAuraDefines.h:73
SpellSchools
Definition: SharedDefines.h:282
SpellSchools GetFirstSchoolInMask(SpellSchoolMask mask)
Definition: SharedDefines.h:318
bool HasAuraType(AuraType auraType) const
Definition: Unit.cpp:5705

References GetFirstSchoolInMask(), HasAuraType(), m_threatModifier, and SPELL_AURA_MOD_THREAT.

Referenced by ThreatCalcHelper::calcThreat().

◆ Attack()

bool Unit::Attack ( Unit victim,
bool  meleeAttack 
)
Todo:
: Implement aggro range, detection range and assistance range templates
10264{
10265 if (!victim || victim == this)
10266 return false;
10267
10268 // dead units can neither attack nor be attacked
10269 if (!IsAlive() || !victim->IsAlive())
10270 return false;
10271
10272 // pussywizard: check map, world, phase >_> multithreading crash fix
10273 if (!IsInMap(victim) || !InSamePhase(victim))
10274 return false;
10275
10276 // player cannot attack in mount state
10277 if (IsPlayer() && IsMounted())
10278 return false;
10279
10280 // creatures cannot attack while evading
10281 Creature* creature = ToCreature();
10282 if (creature && creature->IsInEvadeMode())
10283 {
10284 return false;
10285 }
10286
10287 // creatures should not try to attack the player during polymorph
10288 if (creature && creature->IsPolymorphed())
10289 {
10290 return false;
10291 }
10292
10293 //if (HasUnitFlag(UNIT_FLAG_PACIFIED)) // pussywizard: why having this flag prevents from entering combat? it should just prevent melee attack
10294 // return false;
10295
10296 // nobody can attack GM in GM-mode
10297 if (victim->IsPlayer())
10298 {
10299 if (victim->ToPlayer()->IsGameMaster())
10300 return false;
10301 }
10302 else
10303 {
10304 if (victim->ToCreature()->IsEvadingAttacks())
10305 return false;
10306 }
10307
10308 // Unit with SPELL_AURA_SPIRIT_OF_REDEMPTION can not attack
10310 return false;
10311
10312 // remove SPELL_AURA_MOD_UNATTACKABLE at attack (in case non-interruptible spells stun aura applied also that not let attack)
10315
10316 if (m_attacking)
10317 {
10318 if (m_attacking == victim)
10319 {
10320 // switch to melee attack from ranged/magic
10321 if (meleeAttack)
10322 {
10324 {
10326 SendMeleeAttackStart(victim);
10327 return true;
10328 }
10329 }
10331 {
10333 SendMeleeAttackStop(victim);
10334 return true;
10335 }
10336 return false;
10337 }
10338
10339 // switch target
10340 InterruptSpell(CURRENT_MELEE_SPELL, true, true, true);
10341 if (!meleeAttack)
10343 }
10344
10345 if (m_attacking)
10347
10348 m_attacking = victim;
10350
10351 // Set our target
10352 SetTarget(victim->GetGUID());
10353
10354 if (meleeAttack)
10356
10357 // set position before any AI calls/assistance
10358 //if (IsCreature())
10359 // ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ());
10360 if (creature && !(IsControllableGuardian() && IsControlledByPlayer()))
10361 {
10362 // should not let player enter combat by right clicking target - doesn't helps
10363 SetInCombatWith(victim);
10364 if (victim->IsPlayer())
10365 victim->SetInCombatWith(this);
10366 AddThreat(victim, 0.0f);
10367
10369
10372 {
10373 creature->CallAssistance();
10374 }
10376
10378 }
10379
10380 // delay offhand weapon attack by 50% of the base attack time
10383
10384 if (meleeAttack)
10385 SendMeleeAttackStart(victim);
10386
10387 return true;
10388}
T CalculatePct(T base, U pct)
Definition: Util.h:61
@ SPELL_AURA_SPIRIT_OF_REDEMPTION
Definition: SpellAuraDefines.h:239
@ SPELL_AURA_MOD_UNATTACKABLE
Definition: SpellAuraDefines.h:156
@ CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD
Definition: IWorld.h:283
@ CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE
Definition: CreatureData.h:71
@ CURRENT_MELEE_SPELL
Definition: Unit.h:537
@ UNIT_STATE_MELEE_ATTACKING
Definition: UnitDefines.h:150
@ UNIT_NPC_EMOTESTATE
Definition: UpdateFields.h:140
@ EMOTE_ONESHOT_NONE
Definition: SharedDefines.h:1894
@ AI_REACTION_HOSTILE
Definition: SharedDefines.h:3242
#define sWorld
Definition: World.h:443
void CallAssistance(Unit *target=nullptr)
Definition: Creature.cpp:2432
bool IsEvadingAttacks() const
Definition: Creature.h:138
void SetAssistanceTimer(uint32 value)
Definition: Creature.h:404
void SendAIReaction(AiReaction reactionType)
Definition: Creature.cpp:2420
bool IsInEvadeMode() const
Definition: Creature.h:137
float GetFloatValue(uint16 index) const
Definition: Object.cpp:317
bool InSamePhase(WorldObject const *obj) const
Definition: Object.h:447
bool IsInMap(WorldObject const *obj) const
Definition: Object.cpp:1285
bool IsGameMaster() const
Definition: Player.h:1158
bool HasOffhandWeaponForAttack() const
Definition: Unit.h:1064
void ClearUnitState(uint32 f)
Definition: Unit.h:674
bool IsPolymorphed() const
Definition: Unit.cpp:16728
void AddThreat(Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition: Unit.cpp:14639
void _removeAttacker(Unit *pAttacker)
Definition: Unit.h:1949
void _addAttacker(Unit *pAttacker)
Definition: Unit.h:1948
void SetInCombatWith(Unit *enemy, uint32 duration=0)
Definition: Unit.cpp:13567
bool IsMounted() const
Definition: Unit.h:990
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition: Unit.cpp:3061
bool IsControllableGuardian() const
Definition: Unit.h:709
void SetUInt32Value(uint16 index, uint32 value)
Definition: Unit.cpp:21303
void SendMeleeAttackStop(Unit *victim=nullptr)
Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or int...
Definition: Unit.cpp:3077
bool IsControlledByPlayer() const
Definition: Unit.h:1236
virtual void SetTarget(ObjectGuid=ObjectGuid::Empty)=0

References _addAttacker(), _removeAttacker(), AddThreat(), AddUnitState(), AI_REACTION_HOSTILE, BASE_ATTACK, CalculatePct(), Creature::CallAssistance(), ClearUnitState(), CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD, CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE, CURRENT_MELEE_SPELL, EMOTE_ONESHOT_NONE, CreatureTemplate::flags_extra, getAttackTimer(), Creature::GetCreatureTemplate(), Object::GetFloatValue(), Object::GetGUID(), HasAuraType(), HasOffhandWeaponForAttack(), HasUnitState(), WorldObject::InSamePhase(), InterruptSpell(), IsAlive(), isAttackReady(), IsControllableGuardian(), IsControlledByPlayer(), Creature::IsEvadingAttacks(), Player::IsGameMaster(), Creature::IsInEvadeMode(), WorldObject::IsInMap(), IsMounted(), Object::IsPlayer(), IsPolymorphed(), m_attacking, OFF_ATTACK, RemoveAurasByType(), Creature::SendAIReaction(), SendMeleeAttackStart(), SendMeleeAttackStop(), Creature::SetAssistanceTimer(), setAttackTimer(), SetInCombatWith(), SetTarget(), SetUInt32Value(), SPELL_AURA_MOD_UNATTACKABLE, SPELL_AURA_SPIRIT_OF_REDEMPTION, sWorld, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_BASEATTACKTIME, UNIT_NPC_EMOTESTATE, and UNIT_STATE_MELEE_ATTACKING.

Referenced by UnitAI::AttackStart(), FollowerAI::AttackStart(), PossessedAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::AttackStart(), npc_gunship_mage::npc_gunship_mageAI::AttackStart(), npc_gunship_gunner::npc_gunship_gunnerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), TurretAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), boss_alyson_antille::boss_alyson_antilleAI::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), boss_jormungarAI::AttackStart(), boss_four_horsemen::boss_four_horsemenAI::AttackStart(), boss_magus_telestra::boss_magus_telestraAI::AttackStart(), boss_kologarn::boss_kologarnAI::AttackStart(), boss_mimiron::boss_mimironAI::AttackStart(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::AttackStart(), boss_the_lurker_below::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), boss_nazan::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), npc_pet_gen_gnomish_flame_turret::AttackStart(), UnitAI::AttackStartCaster(), ScriptedAI::AttackStartNoMove(), PetAI::DoAttack(), WorldSession::HandleAttackSwingOpcode(), spell_q12096_q12092_dummy::HandleDummy(), WorldSession::HandlePetActionHelper(), boss_halazzi::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), RemoveCharmedBy(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), Player::UpdateCharmedAI(), and npc_ranger_lilatha::WaypointReached().

◆ AttackerStateUpdate()

void Unit::AttackerStateUpdate ( Unit victim,
WeaponAttackType  attType = BASE_ATTACK,
bool  extra = false,
bool  ignoreCasting = false 
)
2566{
2568 {
2569 return;
2570 }
2571
2572 if (HasUnitState(UNIT_STATE_CANNOT_AUTOATTACK) && !extra && !ignoreCasting)
2573 {
2574 return;
2575 }
2576
2577 if (!victim->IsAlive())
2578 return;
2579
2580 if ((attType == BASE_ATTACK || attType == OFF_ATTACK) && !IsWithinLOSInMap(victim))
2581 return;
2582
2583 // CombatStart puts the target into stand state, so we need to cache sit state here to know if we should crit later
2584 const bool sittingVictim = victim->IsPlayer() && (victim->IsSitState() || victim->getStandState() == UNIT_STAND_STATE_SLEEP);
2585
2586 CombatStart(victim);
2588
2589 if (attType != BASE_ATTACK && attType != OFF_ATTACK)
2590 return; // ignore ranged case
2591
2592 if (!extra && _lastExtraAttackSpell)
2593 {
2595 }
2596
2597 bool meleeAttack = true;
2598
2599 // melee attack spell casted at main hand attack only - no normal melee dmg dealt
2600 if (attType == BASE_ATTACK && m_currentSpells[CURRENT_MELEE_SPELL] && !extra)
2601 {
2602 meleeAttack = false; // The melee attack is replaced by the melee spell
2603
2605 SpellCastResult castResult = meleeSpell->CheckCast(false);
2606 if (castResult != SPELL_CAST_OK)
2607 {
2608 meleeSpell->SendCastResult(castResult);
2609 meleeSpell->SendInterrupted(0);
2610
2611 meleeSpell->finish(false);
2612 meleeSpell->SetExecutedCurrently(false);
2613
2614 if (castResult == SPELL_FAILED_NO_POWER)
2615 {
2616 // Not enough rage, do a regular melee attack instead
2617 meleeAttack = true;
2618 }
2619 }
2620 else
2621 {
2622 meleeSpell->cast(true);
2623 }
2624 }
2625 if (meleeAttack)
2626 {
2627 // attack can be redirected to another target
2628 victim = GetMeleeHitRedirectTarget(victim);
2629 CalcDamageInfo damageInfo;
2630 CalculateMeleeDamage(victim, &damageInfo, attType, sittingVictim);
2631
2632 // Send log damage message to client
2633 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2634 {
2635 Unit::DealDamageMods(victim, damageInfo.damages[i].damage, &damageInfo.damages[i].absorb);
2636 }
2637
2638 SendAttackStateUpdate(&damageInfo);
2639
2640 //TriggerAurasProcOnEvent(damageInfo);
2641
2642 _lastDamagedTargetGuid = victim->GetGUID();
2643
2644 DealMeleeDamage(&damageInfo, true);
2645
2646 DamageInfo dmgInfo(damageInfo);
2647 Unit::ProcDamageAndSpell(damageInfo.attacker, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, dmgInfo.GetDamage(),
2648 damageInfo.attackType, nullptr, nullptr, -1, nullptr, &dmgInfo);
2649
2650 if (IsPlayer())
2651 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (Player) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2652 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2653 else
2654 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (NPC) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2655 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2656
2657 // Let the pet know we've started attacking someting. Handles melee attacks only
2658 // Spells such as auto-shot and others handled in WorldSession::HandleCastSpellOpcode
2659 if (IsPlayer() && !m_Controlled.empty())
2660 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
2661 if (Unit* pet = *itr)
2662 if (pet->IsAlive() && pet->IsCreature())
2663 pet->ToCreature()->AI()->OwnerAttacked(victim);
2664 }
2665}
@ AURA_INTERRUPT_FLAG_MELEE_ATTACK
Definition: SpellDefines.h:55
#define MAX_ITEM_PROTO_DAMAGES
Definition: ItemTemplate.h:613
@ UNIT_STAND_STATE_SLEEP
Definition: UnitDefines.h:35
@ UNIT_STATE_CANNOT_AUTOATTACK
Definition: UnitDefines.h:193
@ UNIT_FLAG_PACIFIED
Definition: UnitDefines.h:246
@ SPELL_FAILED_NO_POWER
Definition: SharedDefines.h:1034
bool IsWithinLOSInMap(WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
Definition: Object.cpp:1347
std::string ToString() const
Definition: ObjectGuid.cpp:47
std::string ToString() const
Definition: Position.cpp:51
Definition: Unit.h:330
Definition: Unit.h:463
uint32 procAttacker
Definition: Unit.h:480
uint32 procVictim
Definition: Unit.h:481
struct CalcDamageInfo::@261 damages[MAX_ITEM_PROTO_DAMAGES]
uint32 absorb
Definition: Unit.h:471
uint32 damage
Definition: Unit.h:470
uint32 procEx
Definition: Unit.h:482
Unit * attacker
Definition: Unit.h:464
Unit * target
Definition: Unit.h:465
WeaponAttackType attackType
Definition: Unit.h:479
void SendAttackStateUpdate(CalcDamageInfo *damageInfo)
Definition: Unit.cpp:6479
void CombatStart(Unit *target, bool initialAggro=true)
Definition: Unit.cpp:13615
Unit * GetMeleeHitRedirectTarget(Unit *victim, SpellInfo const *spellInfo=nullptr)
Definition: Unit.cpp:11043
void CalculateMeleeDamage(Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
Definition: Unit.cpp:1464
static void ProcDamageAndSpell(Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition: Unit.cpp:6378
uint8 getStandState() const
Definition: Unit.h:982
void DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
Definition: Unit.cpp:1829
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition: Unit.cpp:800
void cast(bool skipCheck=false)
Definition: Spell.cpp:3789
void SetExecutedCurrently(bool yes)
Definition: Spell.h:561
void SendInterrupted(uint8 result)
Definition: Spell.cpp:5174
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition: Spell.cpp:4669
void finish(bool ok=true)
Definition: Spell.cpp:4482

References _lastDamagedTargetGuid, _lastExtraAttackSpell, CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::attackType, AURA_INTERRUPT_FLAG_MELEE_ATTACK, BASE_ATTACK, CalculateMeleeDamage(), Spell::cast(), Spell::CheckCast(), CombatStart(), CURRENT_MELEE_SPELL, CalcDamageInfo::damage, CalcDamageInfo::damages, DealDamageMods(), DealMeleeDamage(), Spell::finish(), DamageInfo::GetAbsorb(), DamageInfo::GetBlock(), DamageInfo::GetDamage(), Object::GetGUID(), GetMeleeHitRedirectTarget(), DamageInfo::GetResist(), getStandState(), HasUnitFlag(), HasUnitState(), IsAlive(), Object::IsPlayer(), IsSitState(), WorldObject::IsWithinLOSInMap(), LOG_DEBUG, m_Controlled, m_currentSpells, MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, CalcDamageInfo::procAttacker, ProcDamageAndSpell(), CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RemoveAurasWithInterruptFlags(), SendAttackStateUpdate(), Spell::SendCastResult(), Spell::SendInterrupted(), Spell::SetExecutedCurrently(), SPELL_CAST_OK, SPELL_FAILED_NO_POWER, CalcDamageInfo::target, ObjectGuid::ToString(), Position::ToString(), UNIT_FLAG_PACIFIED, UNIT_STAND_STATE_SLEEP, and UNIT_STATE_CANNOT_AUTOATTACK.

Referenced by UnitAI::DoMeleeAttackIfReady(), boss_zuljin::boss_zuljinAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), HandleProcExtraAttackFor(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Player::Update(), boss_dred::boss_dredAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), and boss_the_lurker_below::UpdateAI().

◆ AttackStop()

bool Unit::AttackStop ( )

Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.

10395{
10396 if (!m_attacking)
10397 return false;
10398
10399 Unit* victim = m_attacking;
10400
10402 m_attacking = nullptr;
10403
10404 // Clear our target
10406
10408
10410
10411 // reset only at real combat stop
10412 if (Creature* creature = ToCreature())
10413 {
10414 creature->SetNoCallAssistance(false);
10415
10416 if (creature->HasSearchedAssistance())
10417 {
10418 creature->SetNoSearchAssistance(false);
10419 }
10420 }
10421
10422 SendMeleeAttackStop(victim);
10423
10424 return true;
10425}

References _removeAttacker(), ClearUnitState(), CURRENT_MELEE_SPELL, ObjectGuid::Empty, InterruptSpell(), m_attacking, SendMeleeAttackStop(), SetTarget(), Object::ToCreature(), and UNIT_STATE_MELEE_ATTACKING.

Referenced by PetAI::_stopAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CombatStop(), boss_jedoga_shadowseeker::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_thekal::DamageTaken(), boss_viscidus::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), ScriptedAI::DoStopAttack(), Player::DuelComplete(), Spell::EffectSanctuary(), SmartAI::EnterEvadeMode(), Spell::finish(), WorldSession::HandleAttackStopOpcode(), spell_hun_scatter_shot::HandleDummy(), spell_mc_play_dead_aura::HandleEffectApply(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetStopAttack(), RotateMovementGenerator::Initialize(), PetAI::KilledUnit(), MotionMaster::MoveSeekAssistance(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), PetSpellFail(), RemoveCharmedBy(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_heigan::boss_heiganAI::StartFightPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), StopAttackFaction(), StopAttackingInvalidTarget(), boss_ouro::Submerge(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ BuildAuraStateUpdateForTarget()

uint32 Unit::BuildAuraStateUpdateForTarget ( Unit target) const
10528{
10530 for (AuraStateAurasMap::const_iterator itr = m_auraStateAuras.begin(); itr != m_auraStateAuras.end(); ++itr)
10531 if ((1 << (itr->first - 1)) & PER_CASTER_AURA_STATE_MASK)
10532 if (itr->second->GetBase()->GetCasterGUID() == target->GetGUID())
10533 auraStates |= (1 << (itr->first - 1));
10534
10535 return auraStates;
10536}
uint32 GetUInt32Value(uint16 index) const
Definition: Object.cpp:305

References Object::GetGUID(), Object::GetUInt32Value(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, and UNIT_FIELD_AURASTATE.

Referenced by PatchValuesUpdate().

◆ BuildCooldownPacket() [1/2]

void Unit::BuildCooldownPacket ( WorldPacket data,
uint8  flags,
PacketCooldowns const &  cooldowns 
)
20982{
20983 data.Initialize(SMSG_SPELL_COOLDOWN, 8 + 1 + (4 + 4) * cooldowns.size());
20984 data << GetGUID();
20985 data << uint8(flags);
20986 for (std::unordered_map<uint32, uint32>::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
20987 {
20988 data << uint32(itr->first);
20989 data << uint32(itr->second);
20990 }
20991}
@ SMSG_SPELL_COOLDOWN
Definition: Opcodes.h:338
void Initialize(uint16 opcode, std::size_t newres=200)
Definition: WorldPacket.h:69

References Object::GetGUID(), WorldPacket::Initialize(), and SMSG_SPELL_COOLDOWN.

◆ BuildCooldownPacket() [2/2]

◆ BuildHeartBeatMsg()

void Unit::BuildHeartBeatMsg ( WorldPacket data) const
2074{
2075 data->Initialize(MSG_MOVE_HEARTBEAT, 32);
2076 *data << GetPackGUID();
2077 BuildMovementPacket(data);
2078}
@ MSG_MOVE_HEARTBEAT
Definition: Opcodes.h:268
void BuildMovementPacket(ByteBuffer *data) const
Definition: Unit.cpp:19887

References BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), and MSG_MOVE_HEARTBEAT.

Referenced by boss_volkhan::boss_volkhanAI::MovementInform(), and SendMovementFlagUpdate().

◆ BuildMovementPacket()

void Unit::BuildMovementPacket ( ByteBuffer data) const
19888{
19889 *data << uint32(GetUnitMovementFlags()); // movement flags
19890 *data << uint16(GetExtraUnitMovementFlags()); // 2.3.0
19891 *data << uint32(GameTime::GetGameTimeMS().count()); // time / counter
19892 *data << GetPositionX();
19893 *data << GetPositionY();
19894 *data << GetPositionZ();
19895 *data << GetOrientation();
19896
19897 // 0x00000200
19899 {
19900 if (m_vehicle)
19901 *data << m_vehicle->GetBase()->GetPackGUID();
19902 else if (GetTransport())
19903 *data << GetTransport()->GetPackGUID();
19904 else
19905 *data << (uint8)0;
19906
19907 *data << float (GetTransOffsetX());
19908 *data << float (GetTransOffsetY());
19909 *data << float (GetTransOffsetZ());
19910 *data << float (GetTransOffsetO());
19911 *data << uint32(GetTransTime());
19912 *data << uint8 (GetTransSeat());
19913
19916 }
19917
19918 // 0x02200000
19921 *data << (float)m_movementInfo.pitch;
19922
19923 *data << (uint32)m_movementInfo.fallTime;
19924
19925 // 0x00001000
19927 {
19928 *data << (float)m_movementInfo.jump.zspeed;
19929 *data << (float)m_movementInfo.jump.sinAngle;
19930 *data << (float)m_movementInfo.jump.cosAngle;
19931 *data << (float)m_movementInfo.jump.xyspeed;
19932 }
19933
19934 // 0x04000000
19936 *data << (float)m_movementInfo.splineElevation;
19937}
@ MOVEMENTFLAG_ONTRANSPORT
Definition: UnitDefines.h:353
@ MOVEMENTFLAG_FLYING
Definition: UnitDefines.h:369
@ MOVEMENTFLAG_FALLING
Definition: UnitDefines.h:356
@ MOVEMENTFLAG_SWIMMING
Definition: UnitDefines.h:365
@ MOVEMENTFLAG_SPLINE_ELEVATION
Definition: UnitDefines.h:370
@ MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING
Definition: UnitDefines.h:405
@ MOVEMENTFLAG2_INTERPOLATED_MOVEMENT
Definition: UnitDefines.h:410
struct MovementInfo::JumpInfo jump
uint32 fallTime
Definition: Object.h:307
struct MovementInfo::TransportInfo transport
float splineElevation
Definition: Object.h:321
float pitch
Definition: Object.h:304
uint32 time2
Definition: Object.h:300
float cosAngle
Definition: Object.h:317
float xyspeed
Definition: Object.h:317
float zspeed
Definition: Object.h:317
float sinAngle
Definition: Object.h:317
float GetTransOffsetX() const
Definition: Object.h:600
float GetTransOffsetY() const
Definition: Object.h:601
float GetTransOffsetZ() const
Definition: Object.h:602
uint32 GetTransTime() const
Definition: Object.h:604
Transport * GetTransport() const
Definition: Object.h:599
float GetTransOffsetO() const
Definition: Object.h:603
uint32 GetUnitMovementFlags() const
Definition: Unit.h:1628
uint16 GetExtraUnitMovementFlags() const
Definition: Unit.h:1634

References MovementInfo::JumpInfo::cosAngle, MovementInfo::fallTime, MovementInfo::flags2, Vehicle::GetBase(), GetExtraUnitMovementFlags(), GameTime::GetGameTimeMS(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransOffsetO(), WorldObject::GetTransOffsetX(), WorldObject::GetTransOffsetY(), WorldObject::GetTransOffsetZ(), WorldObject::GetTransport(), WorldObject::GetTransSeat(), WorldObject::GetTransTime(), GetUnitMovementFlags(), MovementInfo::jump, WorldObject::m_movementInfo, m_vehicle, MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING, MOVEMENTFLAG2_INTERPOLATED_MOVEMENT, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FLYING, MOVEMENTFLAG_ONTRANSPORT, MOVEMENTFLAG_SPLINE_ELEVATION, MOVEMENTFLAG_SWIMMING, MovementInfo::pitch, MovementInfo::JumpInfo::sinAngle, MovementInfo::splineElevation, MovementInfo::TransportInfo::time2, MovementInfo::transport, MovementInfo::JumpInfo::xyspeed, and MovementInfo::JumpInfo::zspeed.

Referenced by BuildHeartBeatMsg(), Object::BuildMovementUpdate(), WorldSession::HandleMoveKnockBackAck(), Player::SendTeleportAckPacket(), SendTeleportPacket(), Player::SetCanFly(), Creature::SetCanFly(), Creature::SetDisableGravity(), Player::SetDisableGravity(), Player::SetFeatherFall(), Creature::SetFeatherFall(), Player::SetHover(), SetSpeed(), Player::SetWaterWalking(), and Creature::SetWaterWalking().

◆ BuildValuesUpdate()

void Unit::BuildValuesUpdate ( uint8  updateType,
ByteBuffer data,
Player target 
)
overrideprotectedvirtual

Reimplemented from Object.

20698{
20699 if (!target)
20700 return;
20701
20703 uint32 visibleFlag = UF_FLAG_PUBLIC;
20704
20705 if (target == this)
20706 visibleFlag |= UF_FLAG_PRIVATE;
20707
20709 if (GetOwnerGUID() == target->GetGUID())
20710 visibleFlag |= UF_FLAG_OWNER;
20711
20714 visibleFlag |= UF_FLAG_SPECIAL_INFO;
20715
20716 if (plr && plr->IsInSameRaidWith(target))
20717 visibleFlag |= UF_FLAG_PARTY_MEMBER;
20718
20719 uint64 cacheKey = static_cast<uint64>(visibleFlag) << 8 | updateType;
20720
20721 auto cacheIt = _valuesUpdateCache.find(cacheKey);
20722 if (cacheIt != _valuesUpdateCache.end())
20723 {
20724 int32 cachePos = static_cast<int32>(data->wpos());
20725 data->append(cacheIt->second.buffer);
20726
20727 BuildValuesCachePosPointers dataAdjustedPos = cacheIt->second.posPointers;
20728 if (cachePos)
20729 dataAdjustedPos.ApplyOffset(cachePos);
20730
20731 PatchValuesUpdate(*data, dataAdjustedPos, target);
20732
20733 return;
20734 }
20735
20736 BuildValuesCachedBuffer cacheValue(500);
20737
20738 ByteBuffer fieldBuffer(400);
20739
20740 UpdateMask updateMask;
20741 updateMask.SetCount(m_valuesCount);
20742
20743 for (uint16 index = 0; index < m_valuesCount; ++index)
20744 {
20745 if (_fieldNotifyFlags & flags[index] ||
20746 ((flags[index] & visibleFlag) & UF_FLAG_SPECIAL_INFO) ||
20747 ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
20749 {
20750 updateMask.SetBit(index);
20751
20752 if (index == UNIT_NPC_FLAGS)
20753 {
20754 cacheValue.posPointers.UnitNPCFlagsPos = int32(fieldBuffer.wpos());
20755 fieldBuffer << m_uint32Values[UNIT_NPC_FLAGS];
20756 }
20757 else if (index == UNIT_FIELD_AURASTATE)
20758 {
20759 cacheValue.posPointers.UnitFieldAuraStatePos = int32(fieldBuffer.wpos());
20760 fieldBuffer << uint32(0); // Fill in later.
20761 }
20762 // FIXME: Some values at server stored in float format but must be sent to client in uint32 format
20763 else if (index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME)
20764 {
20765 // convert from float to uint32 and send
20766 fieldBuffer << uint32(m_floatValues[index] < 0 ? 0 : m_floatValues[index]);
20767 }
20768 // there are some float values which may be negative or can't get negative due to other checks
20769 else if ((index >= UNIT_FIELD_NEGSTAT0 && index <= UNIT_FIELD_NEGSTAT4) ||
20772 (index >= UNIT_FIELD_POSSTAT0 && index <= UNIT_FIELD_POSSTAT4))
20773 {
20774 fieldBuffer << uint32(m_floatValues[index]);
20775 }
20776 // Gamemasters should be always able to select units - remove not selectable flag
20777 else if (index == UNIT_FIELD_FLAGS)
20778 {
20779 cacheValue.posPointers.UnitFieldFlagsPos = int32(fieldBuffer.wpos());
20780 fieldBuffer << m_uint32Values[UNIT_FIELD_FLAGS];
20781 }
20782 // use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures
20783 else if (index == UNIT_FIELD_DISPLAYID)
20784 {
20785 cacheValue.posPointers.UnitFieldDisplayPos = int32(fieldBuffer.wpos());
20786 fieldBuffer << m_uint32Values[UNIT_FIELD_DISPLAYID];
20787 }
20788 else if (index == UNIT_DYNAMIC_FLAGS)
20789 {
20790 cacheValue.posPointers.UnitDynamicFlagsPos = int32(fieldBuffer.wpos());
20792 fieldBuffer << dynamicFlags;
20793 }
20794 else if (index == UNIT_FIELD_BYTES_2)
20795 {
20796 cacheValue.posPointers.UnitFieldBytes2Pos = int32(fieldBuffer.wpos());
20797 fieldBuffer << m_uint32Values[index];
20798 }
20799 else if (index == UNIT_FIELD_FACTIONTEMPLATE)
20800 {
20801 cacheValue.posPointers.UnitFieldFactionTemplatePos = int32(fieldBuffer.wpos());
20802 fieldBuffer << m_uint32Values[index];
20803 }
20804 else
20805 {
20806 if (sScriptMgr->ShouldTrackValuesUpdatePosByIndex(this, updateType, index))
20807 cacheValue.posPointers.other[index] = static_cast<uint32>(fieldBuffer.wpos());
20808
20809 // send in current format (float as float, uint32 as uint32)
20810 fieldBuffer << m_uint32Values[index];
20811 }
20812 }
20813 }
20814
20815 cacheValue.buffer << uint8(updateMask.GetBlockCount());
20816 updateMask.AppendToPacket(&cacheValue.buffer);
20817 int32 fieldBufferPos = static_cast<int32>(cacheValue.buffer.wpos());
20818 cacheValue.buffer.append(fieldBuffer);
20819 cacheValue.posPointers.ApplyOffset(fieldBufferPos);
20820
20821 int32 cachePos = static_cast<int32>(data->wpos());
20822 data->append(cacheValue.buffer);
20823
20824 BuildValuesCachePosPointers dataAdjustedPos = cacheValue.posPointers;
20825 if (cachePos)
20826 dataAdjustedPos.ApplyOffset(cachePos);
20827
20828 PatchValuesUpdate(*data, dataAdjustedPos, target);
20829
20830 _valuesUpdateCache.insert(std::pair<uint64, BuildValuesCachedBuffer>(cacheKey, std::move(cacheValue)));
20831}
std::uint64_t uint64
Definition: Define.h:106
@ SPELL_AURA_EMPATHY
Definition: SpellAuraDefines.h:184
@ UF_FLAG_SPECIAL_INFO
Definition: UpdateFieldFlags.h:32
@ UF_FLAG_PUBLIC
Definition: UpdateFieldFlags.h:27
@ UF_FLAG_OWNER
Definition: UpdateFieldFlags.h:29
@ UF_FLAG_PRIVATE
Definition: UpdateFieldFlags.h:28
@ UF_FLAG_PARTY_MEMBER
Definition: UpdateFieldFlags.h:33
@ UPDATETYPE_VALUES
Definition: UpdateData.h:28
@ UNIT_NPC_FLAGS
Definition: UpdateFields.h:139
@ UNIT_FIELD_RANGEDATTACKTIME
Definition: UpdateFields.h:121
@ UNIT_FIELD_DISPLAYID
Definition: UpdateFields.h:124
@ UNIT_FIELD_FACTIONTEMPLATE
Definition: UpdateFields.h:115
@ UNIT_FIELD_POSSTAT4
Definition: UpdateFields.h:150
@ UNIT_FIELD_NEGSTAT4
Definition: UpdateFields.h:155
@ UNIT_FIELD_FLAGS
Definition: UpdateFields.h:117
@ UNIT_DYNAMIC_FLAGS
Definition: UpdateFields.h:136
uint32 UnitUpdateFieldFlags[PLAYER_END]
Definition: UpdateFieldFlags.cpp:162
@ UNIT_DYNFLAG_SPECIALINFO
Definition: SharedDefines.h:3125
@ UNIT_DYNFLAG_TAPPED_BY_PLAYER
Definition: SharedDefines.h:3124
@ UNIT_DYNFLAG_TAPPED
Definition: SharedDefines.h:3123
uint16 _fieldNotifyFlags
Definition: Object.h:256
bool HasDynamicFlag(uint32 flag) const
Definition: Object.h:119
UpdateMask _changesMask
Definition: Object.h:252
uint32 * m_uint32Values
Definition: Object.h:248
uint16 m_valuesCount
Definition: Object.h:254
float * m_floatValues
Definition: Object.h:249
Definition: UpdateMask.h:25
uint32 GetBlockCount() const
Definition: UpdateMask.h:62
bool GetBit(uint32 index) const
Definition: UpdateMask.h:47
void SetCount(uint32 valuesCount)
Definition: UpdateMask.h:65
void SetBit(uint32 index)
Definition: UpdateMask.h:45
void AppendToPacket(ByteBuffer *data)
Definition: UpdateMask.h:49
bool IsInSameRaidWith(Player const *p) const
Definition: Player.h:1868
ValuesUpdateCache _valuesUpdateCache
Definition: Unit.h:1980
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition: Unit.cpp:10607
bool HasAuraTypeWithCaster(AuraType auratype, ObjectGuid caster) const
Definition: Unit.cpp:5710
ObjectGuid GetOwnerGUID() const
Definition: Unit.h:1222
void PatchValuesUpdate(ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
Definition: Unit.cpp:20833
Definition: UnitUtils.h:65
void ApplyOffset(uint32 offset)
Definition: UnitUtils.h:70
Definition: UnitUtils.h:110
Definition: ByteBuffer.h:70
void append(T value)
Definition: ByteBuffer.h:129
std::size_t wpos() const
Definition: ByteBuffer.h:330

References Object::_changesMask, Object::_fieldNotifyFlags, _valuesUpdateCache, ByteBuffer::append(), UpdateMask::AppendToPacket(), BuildValuesCachePosPointers::ApplyOffset(), BuildValuesCachedBuffer::buffer, UpdateMask::GetBit(), UpdateMask::GetBlockCount(), GetCharmerOrOwnerPlayerOrPlayerItself(), Object::GetGUID(), GetOwnerGUID(), HasAuraTypeWithCaster(), Object::HasDynamicFlag(), Object::HasFlag(), Player::IsInSameRaidWith(), Object::m_floatValues, Object::m_uint32Values, Object::m_valuesCount, BuildValuesCachePosPointers::other, PatchValuesUpdate(), PER_CASTER_AURA_STATE_MASK, BuildValuesCachedBuffer::posPointers, UpdateMask::SetBit(), UpdateMask::SetCount(), SPELL_AURA_EMPATHY, sScriptMgr, UF_FLAG_OWNER, UF_FLAG_PARTY_MEMBER, UF_FLAG_PRIVATE, UF_FLAG_PUBLIC, UF_FLAG_SPECIAL_INFO, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_SPECIALINFO, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_FIELD_AURASTATE, UNIT_FIELD_BASEATTACKTIME, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FACTIONTEMPLATE, UNIT_FIELD_FLAGS, UNIT_FIELD_NEGSTAT0, UNIT_FIELD_NEGSTAT4, UNIT_FIELD_POSSTAT0, UNIT_FIELD_POSSTAT4, UNIT_FIELD_RANGEDATTACKTIME, UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, BuildValuesCachePosPointers::UnitNPCFlagsPos, UnitUpdateFieldFlags, UPDATETYPE_VALUES, and ByteBuffer::wpos().

◆ CalcAbsorbResist()

void Unit::CalcAbsorbResist ( DamageInfo dmgInfo,
bool  Splited = false 
)
static
2148{
2149 Unit* victim = dmgInfo.GetVictim();
2150 Unit* attacker = dmgInfo.GetAttacker();
2151 uint32 damage = dmgInfo.GetDamage();
2152 SpellSchoolMask schoolMask = dmgInfo.GetSchoolMask();
2153 SpellInfo const* spellInfo = dmgInfo.GetSpellInfo();
2154
2155 if (!victim || !victim->IsAlive() || !damage)
2156 return;
2157
2158 // Magic damage, check for resists
2159 // Ignore spells that cant be resisted
2160 // Xinef: holy resistance exists for npcs
2161 if (!(schoolMask & SPELL_SCHOOL_MASK_NORMAL) && (!(schoolMask & SPELL_SCHOOL_MASK_HOLY) || victim->IsCreature()) && (!spellInfo || (!spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))))
2162 {
2163 float averageResist = Unit::GetEffectiveResistChance(attacker, schoolMask, victim);
2164
2165 float discreteResistProbability[11];
2166 for (uint32 i = 0; i < 11; ++i)
2167 {
2168 discreteResistProbability[i] = 0.5f - 2.5f * std::fabs(0.1f * i - averageResist);
2169 if (discreteResistProbability[i] < 0.0f)
2170 discreteResistProbability[i] = 0.0f;
2171 }
2172
2173 if (averageResist <= 0.1f)
2174 {
2175 discreteResistProbability[0] = 1.0f - 7.5f * averageResist;
2176 discreteResistProbability[1] = 5.0f * averageResist;
2177 discreteResistProbability[2] = 2.5f * averageResist;
2178 }
2179
2180 float r = float(rand_norm());
2181 uint32 i = 0;
2182 float probabilitySum = discreteResistProbability[0];
2183
2184 while (r >= probabilitySum && i < 10)
2185 probabilitySum += discreteResistProbability[++i];
2186
2187 float damageResisted = float(damage * i / 10);
2188
2189 if (damageResisted) // if equal to 0, checking these is pointless
2190 {
2191 if (attacker)
2192 {
2194 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2195 if (((*j)->GetMiscValue() & schoolMask) && (*j)->IsAffectedOnSpell(spellInfo))
2196 AddPct(damageResisted, -(*j)->GetAmount());
2197
2199 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2200 if ((*j)->GetMiscValue() & schoolMask)
2201 AddPct(damageResisted, -(*j)->GetAmount());
2202 }
2203
2204 // pussywizard:
2205 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC))
2206 {
2207 uint32 damageAfterArmor = Unit::CalcArmorReducedDamage(attacker, victim, damage, spellInfo, 0, BASE_ATTACK);
2208 uint32 armorReduction = damage - damageAfterArmor;
2209 if (armorReduction < damageResisted) // pick the lower one, the weakest resistance counts
2210 damageResisted = armorReduction;
2211 }
2212 }
2213
2214 dmgInfo.ResistDamage(uint32(damageResisted));
2215 }
2216
2217 // Ignore Absorption Auras
2218 float auraAbsorbMod = 0;
2219 if (attacker)
2220 {
2222 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasA.begin(); itr != AbsIgnoreAurasA.end(); ++itr)
2223 {
2224 if (!((*itr)->GetMiscValue() & schoolMask))
2225 continue;
2226
2227 if ((*itr)->GetAmount() > auraAbsorbMod)
2228 auraAbsorbMod = float((*itr)->GetAmount());
2229 }
2230
2232 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasB.begin(); itr != AbsIgnoreAurasB.end(); ++itr)
2233 {
2234 if (!((*itr)->GetMiscValue() & schoolMask))
2235 continue;
2236
2237 if (((*itr)->GetAmount() > auraAbsorbMod) && (*itr)->IsAffectedOnSpell(spellInfo))
2238 auraAbsorbMod = float((*itr)->GetAmount());
2239 }
2240 RoundToInterval(auraAbsorbMod, 0.0f, 100.0f);
2241 }
2242
2243 // We're going to call functions which can modify content of the list during iteration over it's elements
2244 // Let's copy the list so we can prevent iterator invalidation
2246 vSchoolAbsorbCopy.sort(Acore::AbsorbAuraOrderPred());
2247
2248 // absorb without mana cost
2249 for (AuraEffectList::iterator itr = vSchoolAbsorbCopy.begin(); (itr != vSchoolAbsorbCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2250 {
2251 AuraEffect* absorbAurEff = *itr;
2252 // Check if aura was removed during iteration - we don't need to work on such auras
2253 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2254 if (!aurApp)
2255 continue;
2256 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2257 continue;
2258
2259 // get amount which can be still absorbed by the aura
2260 int32 currentAbsorb = absorbAurEff->GetAmount();
2261 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2262 if (currentAbsorb < 0)
2263 currentAbsorb = 0;
2264
2265 uint32 tempAbsorb = uint32(currentAbsorb);
2266
2267 bool defaultPrevented = false;
2268
2269 absorbAurEff->GetBase()->CallScriptEffectAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2270 currentAbsorb = tempAbsorb;
2271
2272 if (defaultPrevented)
2273 continue;
2274
2275 // absorb must be smaller than the damage itself
2276 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2277
2278 // xinef: do this after absorb is rounded to damage...
2279 AddPct(currentAbsorb, -auraAbsorbMod);
2280
2281 dmgInfo.AbsorbDamage(currentAbsorb);
2282
2283 tempAbsorb = currentAbsorb;
2284 absorbAurEff->GetBase()->CallScriptEffectAfterAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2285
2286 // Check if our aura is using amount to count damage
2287 if (absorbAurEff->GetAmount() >= 0)
2288 {
2289 // Reduce shield amount
2290 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2291 // Aura cannot absorb anything more - remove it
2292 if (absorbAurEff->GetAmount() <= 0)
2293 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2294 }
2295 }
2296
2297 // absorb by mana cost
2299 for (AuraEffectList::const_iterator itr = vManaShieldCopy.begin(); (itr != vManaShieldCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2300 {
2301 AuraEffect* absorbAurEff = *itr;
2302 // Check if aura was removed during iteration - we don't need to work on such auras
2303 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2304 if (!aurApp)
2305 continue;
2306 // check damage school mask
2307 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2308 continue;
2309
2310 // get amount which can be still absorbed by the aura
2311 int32 currentAbsorb = absorbAurEff->GetAmount();
2312 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2313 if (currentAbsorb < 0)
2314 currentAbsorb = 0;
2315
2316 uint32 tempAbsorb = currentAbsorb;
2317
2318 bool defaultPrevented = false;
2319
2320 absorbAurEff->GetBase()->CallScriptEffectManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2321 currentAbsorb = tempAbsorb;
2322
2323 if (defaultPrevented)
2324 continue;
2325
2326 // absorb must be smaller than the damage itself
2327 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2328
2329 // xinef: do this after absorb is rounded to damage...
2330 AddPct(currentAbsorb, -auraAbsorbMod);
2331
2332 int32 manaReduction = currentAbsorb;
2333
2334 // lower absorb amount by talents
2335 if (float manaMultiplier = absorbAurEff->GetSpellInfo()->Effects[absorbAurEff->GetEffIndex()].CalcValueMultiplier(absorbAurEff->GetCaster()))
2336 manaReduction = int32(float(manaReduction) * manaMultiplier);
2337
2338 int32 manaTaken = -victim->ModifyPower(POWER_MANA, -manaReduction);
2339
2340 // take case when mana has ended up into account
2341 currentAbsorb = currentAbsorb ? int32(float(currentAbsorb) * (float(manaTaken) / float(manaReduction))) : 0;
2342
2343 dmgInfo.AbsorbDamage(currentAbsorb);
2344
2345 tempAbsorb = currentAbsorb;
2346 absorbAurEff->GetBase()->CallScriptEffectAfterManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2347
2348 // Check if our aura is using amount to count damage
2349 if (absorbAurEff->GetAmount() >= 0)
2350 {
2351 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2352 if ((absorbAurEff->GetAmount() <= 0))
2353 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2354 }
2355 }
2356
2357 // split damage auras - only when not damaging self
2358 // Xinef: not true - Warlock Hellfire
2359 if (/*victim != attacker &&*/ !Splited)
2360 {
2361 // We're going to call functions which can modify content of the list during iteration over it's elements
2362 // Let's copy the list so we can prevent iterator invalidation
2363 AuraEffectList vSplitDamageFlatCopy(victim->GetAuraEffectsByType(SPELL_AURA_SPLIT_DAMAGE_FLAT)); // Not used by any spell
2364 for (AuraEffectList::iterator itr = vSplitDamageFlatCopy.begin(); (itr != vSplitDamageFlatCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2365 {
2366 // Check if aura was removed during iteration - we don't need to work on such auras
2367 if (!((*itr)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
2368 continue;
2369 // check damage school mask
2370 if (!((*itr)->GetMiscValue() & schoolMask))
2371 continue;
2372
2373 // Damage can be splitted only if aura has an alive caster
2374 Unit* caster = (*itr)->GetCaster();
2375 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2376 continue;
2377
2378 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2379 // Ignore LOS attribute is only used for the cast portion of the spell
2380 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2381 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2382 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2383 continue;
2384
2385 int32 splitDamage = (*itr)->GetAmount();
2386
2387 // absorb must be smaller than the damage itself
2388 splitDamage = RoundToInterval(splitDamage, 0, int32(dmgInfo.GetDamage()));
2389
2390 dmgInfo.AbsorbDamage(splitDamage);
2391
2392 uint32 splitted = splitDamage;
2393 uint32 splitted_absorb = 0;
2394 uint32 splitted_resist = 0;
2395
2396 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2397 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, schoolMask, dmgInfo.GetDamageType());
2398 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2399 {
2400 procEx |= PROC_EX_IMMUNE;
2401 splittedDmgInfo.AbsorbDamage(splitted);
2402 }
2403 else
2404 {
2405 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2406 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2407 }
2408
2409 splitted_absorb = splittedDmgInfo.GetAbsorb();
2410 splitted_resist = splittedDmgInfo.GetResist();
2411 splitted = splittedDmgInfo.GetDamage();
2412
2413 // create procs
2414 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2415 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted, nullptr, -1, nullptr, &splittedDmgInfo);
2416
2417 if (attacker)
2418 {
2419 attacker->SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo(), splitted, schoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2420 }
2421
2422 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2423 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false);
2424 }
2425
2426 // We're going to call functions which can modify content of the list during iteration over it's elements
2427 // Let's copy the list so we can prevent iterator invalidation
2429 for (AuraEffectList::iterator itr = vSplitDamagePctCopy.begin(), next; (itr != vSplitDamagePctCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2430 {
2431 // Check if aura was removed during iteration - we don't need to work on such auras
2432 AuraApplication const* aurApp = (*itr)->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2433 if (!aurApp)
2434 continue;
2435
2436 // check damage school mask
2437 if (!((*itr)->GetMiscValue() & schoolMask))
2438 continue;
2439
2440 // Damage can be splitted only if aura has an alive caster
2441 Unit* caster = (*itr)->GetCaster();
2442 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2443 continue;
2444
2445 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2446 // Ignore LOS attribute is only used for the cast portion of the spell
2447 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2448 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2449 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2450 continue;
2451
2452 uint32 splitDamage = CalculatePct(dmgInfo.GetDamage(), (*itr)->GetAmount());
2453 SpellSchoolMask splitSchoolMask = schoolMask;
2454
2455 (*itr)->GetBase()->CallScriptEffectSplitHandlers(*itr, aurApp, dmgInfo, splitDamage);
2456
2457 // absorb must be smaller than the damage itself
2458 splitDamage = RoundToInterval(splitDamage, uint32(0), uint32(dmgInfo.GetDamage()));
2459
2460 // Roar of Sacrifice, dont absorb it
2461 if (splitSpellInfo->Id != 53480)
2462 dmgInfo.AbsorbDamage(splitDamage);
2463 else
2464 splitSchoolMask = SPELL_SCHOOL_MASK_NATURE;
2465
2466 uint32 splitted = splitDamage;
2467 uint32 splitted_absorb = 0;
2468 uint32 splitted_resist = 0;
2469
2470 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2471 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, splitSchoolMask, dmgInfo.GetDamageType());
2472 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2473 {
2474 procEx |= PROC_EX_IMMUNE;
2475 splittedDmgInfo.AbsorbDamage(splitted);
2476 }
2477 else
2478 {
2479 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2480 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2481 }
2482
2483 splitted_absorb = splittedDmgInfo.GetAbsorb();
2484 splitted_resist = splittedDmgInfo.GetResist();
2485 splitted = splittedDmgInfo.GetDamage();
2486
2487 // create procs
2488 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2489 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted);
2490
2491 if (attacker)
2492 {
2493 attacker->SendSpellNonMeleeDamageLog(caster, splitSpellInfo, splitted, splitSchoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2494 }
2495
2496 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2497 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, splitSchoolMask, splitSpellInfo, false);
2498 }
2499 }
2500}
double rand_norm()
Definition: Random.cpp:77
T AddPct(T &base, U pct)
Definition: Util.h:67
T RoundToInterval(T &num, T floor, T ceil)
Definition: Util.h:79
@ SPELL_ATTR0_CU_BINARY_SPELL
Definition: SpellInfo.h:196
@ SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC
Definition: SpellInfo.h:199
@ SPELL_AURA_MANA_SHIELD
Definition: SpellAuraDefines.h:160
@ SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL
Definition: SpellAuraDefines.h:257
@ SPELL_AURA_MOD_IGNORE_TARGET_RESIST
Definition: SpellAuraDefines.h:332
@ SPELL_AURA_SPLIT_DAMAGE_FLAT
Definition: SpellAuraDefines.h:216
@ SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL
Definition: SpellAuraDefines.h:258
@ SPELL_AURA_SPLIT_DAMAGE_PCT
Definition: SpellAuraDefines.h:144
@ SPELL_AURA_SCHOOL_ABSORB
Definition: SpellAuraDefines.h:132
@ SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST
Definition: SpellAuraDefines.h:333
@ AURA_REMOVE_BY_ENEMY_SPELL
Definition: SpellAuraDefines.h:394
@ PROC_EX_NORMAL_HIT
Definition: SpellMgr.h:194
@ PROC_EX_IMMUNE
Definition: SpellMgr.h:202
void createProcFlags(SpellInfo const *spellInfo, WeaponAttackType attackType, bool positive, uint32 &procAttacker, uint32 &procVictim)
Definition: Unit.cpp:15907
@ DIRECT_DAMAGE
Definition: Unit.h:248
@ MELEE_HIT_NORMAL
Definition: Unit.h:286
@ POWER_MANA
Definition: SharedDefines.h:269
@ SPELL_ATTR4_NO_CAST_LOG
Definition: SharedDefines.h:530
SpellSchoolMask
Definition: SharedDefines.h:295
@ SPELL_SCHOOL_MASK_NORMAL
Definition: SharedDefines.h:297
@ SPELL_SCHOOL_MASK_NATURE
Definition: SharedDefines.h:300
@ SPELL_SCHOOL_MASK_HOLY
Definition: SharedDefines.h:298
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition: Object.cpp:1316
Definition: Unit.h:315
void ResistDamage(uint32 amount)
Definition: Unit.cpp:158
void AbsorbDamage(uint32 amount)
Definition: Unit.cpp:151
Unit * GetVictim() const
Definition: Unit.h:359
Unit * GetAttacker() const
Definition: Unit.h:358
SpellInfo const * GetSpellInfo() const
Definition: Unit.h:360
DamageEffectType GetDamageType() const
Definition: Unit.h:362
SpellSchoolMask GetSchoolMask() const
Definition: Unit.h:361
uint32 GetDamage() const
Definition: Unit.h:364
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition: Unit.cpp:14135
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition: Unit.h:1374
static uint32 CalcArmorReducedDamage(Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
Definition: Unit.cpp:2031
static float GetEffectiveResistChance(Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
Definition: Unit.cpp:2113
void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log)
Definition: Unit.cpp:6310
void ProcDamageAndSpellFor(bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition: Unit.cpp:16041
std::list< AuraEffect * > AuraEffectList
Definition: Unit.h:646
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12887
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition: Unit.cpp:2147
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
Definition: Unit.cpp:810
Definition: SpellAuraEffects.h:39
SpellInfo const * GetSpellInfo() const
Definition: SpellAuraEffects.h:54
void SetAmount(int32 amount)
Definition: SpellAuraEffects.h:66
Unit * GetCaster() const
Definition: SpellAuraEffects.h:47
int32 GetMiscValue() const
Definition: SpellAuraEffects.cpp:442
Aura * GetBase() const
Definition: SpellAuraEffects.h:49
uint32 GetEffIndex() const
Definition: SpellAuraEffects.h:56
int32 GetAmount() const
Definition: SpellAuraEffects.h:64
Definition: SpellAuraEffects.h:349
void CallScriptEffectAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition: SpellAuras.cpp:2559
void CallScriptEffectAfterAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition: SpellAuras.cpp:2577
void CallScriptEffectManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition: SpellAuras.cpp:2591
void CallScriptEffectAfterManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition: SpellAuras.cpp:2605
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition: SpellInfo.h:393
float GetMaxRange(bool positive=false, Unit *caster=nullptr, Spell *spell=nullptr) const
Definition: SpellInfo.cpp:2322
bool IsPositive() const
Definition: SpellInfo.cpp:1236

References DamageInfo::AbsorbDamage(), AddPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculatePct(), Aura::CallScriptEffectAbsorbHandlers(), Aura::CallScriptEffectAfterAbsorbHandlers(), Aura::CallScriptEffectAfterManaShieldHandlers(), Aura::CallScriptEffectManaShieldHandlers(), createProcFlags(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, SpellInfo::Effects, DamageInfo::GetAbsorb(), AuraEffect::GetAmount(), Aura::GetApplicationOfTarget(), DamageInfo::GetAttacker(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraApplication::GetBase(), AuraEffect::GetCaster(), DamageInfo::GetDamage(), DamageInfo::GetDamageType(), GetEffectiveResistChance(), AuraEffect::GetEffIndex(), Object::GetGUID(), SpellInfo::GetMaxRange(), AuraEffect::GetMiscValue(), DamageInfo::GetResist(), DamageInfo::GetSchoolMask(), DamageInfo::GetSpellInfo(), AuraEffect::GetSpellInfo(), DamageInfo::GetVictim(), SpellInfo::HasAttribute(), SpellInfo::Id, IsAlive(), Object::IsCreature(), IsImmunedToDamageOrSchool(), Object::IsInWorld(), SpellInfo::IsPositive(), WorldObject::IsWithinDist(), MELEE_HIT_NORMAL, ModifyPower(), POWER_MANA, PROC_EX_IMMUNE, PROC_EX_NORMAL_HIT, ProcDamageAndSpellFor(), rand_norm(), Aura::Remove(), DamageInfo::ResistDamage(), RoundToInterval(), SendSpellNonMeleeDamageLog(), AuraEffect::SetAmount(), SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC, SPELL_ATTR4_NO_CAST_LOG, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL, SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL, SPELL_AURA_SCHOOL_ABSORB, SPELL_AURA_SPLIT_DAMAGE_FLAT, SPELL_AURA_SPLIT_DAMAGE_PCT, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NATURE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalcAbsorbResist(), CalculateSpellDamageTaken(), DealDamage(), DealMeleeDamage(), Player::EnvironmentalDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and spell_valkyr_touch::spell_valkyr_touchAuraScript::PrepareAuraScript().

◆ CalcArmorReducedDamage()

uint32 Unit::CalcArmorReducedDamage ( Unit const *  attacker,
Unit const *  victim,
const uint32  damage,
SpellInfo const *  spellInfo,
uint8  attackerLevel = 0,
WeaponAttackType  attackType = MAX_ATTACK 
)
static
2032{
2033 float armor = float(victim->GetArmor());
2034
2035 // Ignore enemy armor by SPELL_AURA_MOD_TARGET_RESISTANCE aura
2036 if (attacker)
2037 {
2038 armor += attacker->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL);
2039
2040 if (spellInfo)
2041 if (Player* modOwner = attacker->GetSpellModOwner())
2042 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_IGNORE_ARMOR, armor);
2043
2044 AuraEffectList const& ResIgnoreAurasAb = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST);
2045 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2046 {
2047 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL
2048 && (*j)->IsAffectedOnSpell(spellInfo))
2049 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2050 }
2051
2052 AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
2053 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2054 {
2055 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
2056 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2057 }
2058
2059 // Apply Player CR_ARMOR_PENETRATION rating and buffs from stances\specializations etc.
2060 if (attacker->IsPlayer())
2061 {
2062 float bonusPct = 0;
2063 AuraEffectList const& armorPenAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ARMOR_PENETRATION_PCT);
2064 for (AuraEffectList::const_iterator itr = armorPenAuras.begin(); itr != armorPenAuras.end(); ++itr)
2065 {
2066 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
2067 {
2068 if (!spellInfo || (*itr)->IsAffectedOnSpell(spellInfo) || (*itr)->GetMiscValue() & spellInfo->GetSchoolMask())
2069 bonusPct += (*itr)->GetAmount();
2070 else if (!(*itr)->GetMiscValue() && !(*itr)->HasSpellClassMask())
2071 bonusPct += (*itr)->GetAmount();
2072 }
2073 else
2074 {
2075 if (attacker->ToPlayer()->HasItemFitToSpellRequirements((*itr)->GetSpellInfo()))
2076 bonusPct += (*itr)->GetAmount();
2077 }
2078 }
2079
2080 float maxArmorPen = 0;
2081 if (victim->GetLevel() < 60)
2082 maxArmorPen = float(400 + 85 * victim->GetLevel());
2083 else
2084 maxArmorPen = 400 + 85 * victim->GetLevel() + 4.5f * 85 * (victim->GetLevel() - 59);
2085
2086 // Cap armor penetration to this number
2087 maxArmorPen = std::min((armor + maxArmorPen) / 3, armor);
2088 // Figure out how much armor do we ignore
2089 float armorPen = CalculatePct(maxArmorPen, bonusPct + attacker->ToPlayer()->GetRatingBonusValue(CR_ARMOR_PENETRATION));
2090 // Got the value, apply it
2091 armor -= std::min(armorPen, maxArmorPen);
2092 }
2093 }
2094
2095 if (armor < 0.0f)
2096 armor = 0.0f;
2097
2098 float levelModifier = attacker ? attacker->GetLevel() : attackerLevel;
2099 if (levelModifier > 59)
2100 levelModifier = levelModifier + (4.5f * (levelModifier - 59));
2101
2102 float tmpvalue = 0.1f * armor / (8.5f * levelModifier + 40);
2103 tmpvalue = tmpvalue / (1.0f + tmpvalue);
2104
2105 if (tmpvalue < 0.0f)
2106 tmpvalue = 0.0f;
2107 if (tmpvalue > 0.75f)
2108 tmpvalue = 0.75f;
2109
2110 return uint32(std::ceil(std::max(damage * (1.0f - tmpvalue), 0.0f)));
2111}
@ SPELLMOD_IGNORE_ARMOR
Definition: SpellDefines.h:89
@ SPELL_AURA_MOD_ARMOR_PENETRATION_PCT
Definition: SpellAuraDefines.h:343
@ SPELL_AURA_MOD_TARGET_RESISTANCE
Definition: SpellAuraDefines.h:186
@ CR_ARMOR_PENETRATION
Definition: Unit.h:241

References AddPct(), CalculatePct(), CR_ARMOR_PENETRATION, GetArmor(), GetAuraEffectsByType(), GetLevel(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), Player::HasItemFitToSpellRequirements(), SpellInfo::Id, Object::IsPlayer(), SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_ARMOR_PENETRATION_PCT, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL, SPELLMOD_IGNORE_ARMOR, and Object::ToPlayer().

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), boss_priestess_lackey_commonAI::GetThreatMod(), boss_faction_championsAI::GetThreatMod(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcHealAbsorb()

void Unit::CalcHealAbsorb ( HealInfo healInfo)
static
2503{
2504 if (!healInfo.GetHeal())
2505 return;
2506
2507 int32 const healing = static_cast<int32>(healInfo.GetHeal());
2508 int32 absorbAmount = 0;
2509
2510 // Need remove expired auras after
2511 bool existExpired = false;
2512
2513 // absorb without mana cost
2515 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end() && absorbAmount <= healing; ++i)
2516 {
2517 if (!((*i)->GetMiscValue() & healInfo.GetSpellInfo()->SchoolMask))
2518 continue;
2519
2520 // Max Amount can be absorbed by this aura
2521 int32 currentAbsorb = (*i)->GetAmount();
2522
2523 // Found empty aura (impossible but..)
2524 if (currentAbsorb <= 0)
2525 {
2526 existExpired = true;
2527 continue;
2528 }
2529
2530 // currentAbsorb - damage can be absorbed by shield
2531 // If need absorb less damage
2532 if (healing < currentAbsorb + absorbAmount)
2533 currentAbsorb = healing - absorbAmount;
2534
2535 absorbAmount += currentAbsorb;
2536
2537 // Reduce shield amount
2538 (*i)->SetAmount((*i)->GetAmount() - currentAbsorb);
2539 // Need remove it later
2540 if ((*i)->GetAmount() <= 0)
2541 existExpired = true;
2542 }
2543
2544 // Remove all expired absorb auras
2545 if (existExpired)
2546 {
2547 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end();)
2548 {
2549 AuraEffect* auraEff = *i;
2550 ++i;
2551 if (auraEff->GetAmount() <= 0)
2552 {
2553 uint32 removedAuras = healInfo.GetTarget()->m_removedAurasCount;
2555 if (removedAuras + 1 < healInfo.GetTarget()->m_removedAurasCount)
2556 i = vHealAbsorb.begin();
2557 }
2558 }
2559 }
2560
2561 if (absorbAmount > 0)
2562 healInfo.AbsorbHeal(absorbAmount);
2563}
@ SPELL_AURA_SCHOOL_HEAL_ABSORB
Definition: SpellAuraDefines.h:364
SpellInfo const * GetSpellInfo() const
Definition: Unit.h:415
void AbsorbHeal(uint32 amount)
Definition: Unit.h:390
Unit * GetTarget() const
Definition: Unit.h:411
uint32 GetHeal() const
Definition: Unit.h:412
uint32 SchoolMask
Definition: SpellInfo.h:392

References HealInfo::AbsorbHeal(), AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::GetAmount(), GetAuraEffectsByType(), AuraEffect::GetBase(), HealInfo::GetHeal(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), m_removedAurasCount, Aura::Remove(), SpellInfo::SchoolMask, and SPELL_AURA_SCHOOL_HEAL_ABSORB.

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), and HealBySpell().

◆ CalcSpellDuration()

int32 Unit::CalcSpellDuration ( SpellInfo const *  spellProto)
14843{
14844 uint8 comboPoints = GetComboPoints();
14845
14846 int32 minduration = spellProto->GetDuration();
14847 int32 maxduration = spellProto->GetMaxDuration();
14848
14849 int32 duration;
14850
14851 if (comboPoints && minduration != -1 && minduration != maxduration)
14852 duration = minduration + int32((maxduration - minduration) * comboPoints / 5);
14853 else
14854 duration = minduration;
14855
14856 return duration;
14857}
uint8 GetComboPoints(Unit const *who=nullptr) const
--------—Combo point system----------------—
Definition: Unit.h:1643

References GetComboPoints(), SpellInfo::GetDuration(), and SpellInfo::GetMaxDuration().

Referenced by Aura::CalcMaxDuration(), Spell::EffectInterruptCast(), Spell::EffectSchoolDMG(), and Aura::HandleAuraSpecificMods().

◆ CalculateAOEDamageReduction()

int32 Unit::CalculateAOEDamageReduction ( int32  damage,
uint32  schoolMask,
Unit caster 
) const
20382{
20383 damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, schoolMask));
20384 if (caster && caster->IsCreature())
20386
20387 return damage;
20388}
@ SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE
Definition: SpellAuraDefines.h:373
@ SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE
Definition: SpellAuraDefines.h:292
float GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:5974

References GetTotalAuraMultiplierByMiscMask(), Object::IsCreature(), SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, and SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget(), AuraEffect::HandlePeriodicDamageAurasTick(), and spell_dk_death_and_decay::RecalculateDamage().

◆ CalculateDamage()

uint32 Unit::CalculateDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
uint8  itemDamagesMask = 0 
)
2985{
2986 float minDamage = 0.0f;
2987 float maxDamage = 0.0f;
2988
2989 if (normalized || !addTotalPct || itemDamagesMask)
2990 {
2991 // get both by default
2992 if (!itemDamagesMask)
2993 {
2994 itemDamagesMask = (1 << 0) | (1 << 1);
2995 }
2996
2997 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2998 {
2999 if (itemDamagesMask & (1 << i))
3000 {
3001 float minTmp, maxTmp;
3002 CalculateMinMaxDamage(attType, normalized, addTotalPct, minTmp, maxTmp, i);
3003 minDamage += minTmp;
3004 maxDamage += maxTmp;
3005 }
3006 }
3007 }
3008 else
3009 {
3010 switch (attType)
3011 {
3012 case RANGED_ATTACK:
3015 break;
3016 case BASE_ATTACK:
3019 break;
3020 case OFF_ATTACK:
3023 break;
3024 default:
3025 break;
3026 }
3027 }
3028
3029 minDamage = std::max(0.f, minDamage);
3030 maxDamage = std::max(0.f, maxDamage);
3031
3032 if (minDamage > maxDamage)
3033 {
3034 std::swap(minDamage, maxDamage);
3035 }
3036
3037 return urand(uint32(minDamage), uint32(maxDamage));
3038}
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:44
@ UNIT_FIELD_MINDAMAGE
Definition: UpdateFields.h:127
@ UNIT_FIELD_MAXDAMAGE
Definition: UpdateFields.h:128
@ UNIT_FIELD_MAXOFFHANDDAMAGE
Definition: UpdateFields.h:130
@ UNIT_FIELD_MAXRANGEDDAMAGE
Definition: UpdateFields.h:169
@ UNIT_FIELD_MINRANGEDDAMAGE
Definition: UpdateFields.h:168
@ UNIT_FIELD_MINOFFHANDDAMAGE
Definition: UpdateFields.h:129
virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0

References BASE_ATTACK, CalculateMinMaxDamage(), Object::GetFloatValue(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, UNIT_FIELD_MINRANGEDDAMAGE, and urand().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ CalculateDefaultCoefficient()

float Unit::CalculateDefaultCoefficient ( SpellInfo const *  spellInfo,
DamageEffectType  damagetype 
) const
17184{
17185 // Damage over Time spells bonus calculation
17186 float DotFactor = 1.0f;
17187 if (damagetype == DOT)
17188 {
17189 int32 DotDuration = spellInfo->GetDuration();
17190 if (!spellInfo->IsChanneled() && DotDuration > 0)
17191 DotFactor = DotDuration / 15000.0f;
17192
17193 if (uint32 DotTicks = spellInfo->GetMaxTicks())
17194 DotFactor /= DotTicks;
17195 }
17196
17197 int32 CastingTime = spellInfo->IsChanneled() ? spellInfo->GetDuration() : spellInfo->CalcCastTime();
17198 // Distribute Damage over multiple effects, reduce by AoE
17199 CastingTime = GetCastingTimeForBonus(spellInfo, damagetype, CastingTime);
17200
17201 // As wowwiki says: C = (Cast Time / 3.5)
17202 return (CastingTime / 3500.0f) * DotFactor;
17203}
@ DOT
Definition: Unit.h:250
uint32 GetCastingTimeForBonus(SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
Definition: Unit.cpp:17065

References SpellInfo::CalcCastTime(), DOT, GetCastingTimeForBonus(), SpellInfo::GetDuration(), SpellInfo::GetMaxTicks(), and SpellInfo::IsChanneled().

Referenced by SpellDamageBonusTaken().

◆ CalculateLevelPenalty()

float Unit::CalculateLevelPenalty ( SpellInfo const *  spellProto) const
3041{
3042 if (!IsPlayer())
3043 return 1.0f;
3044
3045 if (spellProto->SpellLevel <= 0 || spellProto->SpellLevel >= spellProto->MaxLevel)
3046 return 1.0f;
3047
3048 float LvlPenalty = 0.0f;
3049
3050 // xinef: added brackets
3051 if (spellProto->SpellLevel < 20)
3052 LvlPenalty = (20.0f - spellProto->SpellLevel) * 3.75f;
3053
3054 float LvlFactor = (float(spellProto->SpellLevel) + 6.0f) / float(GetLevel());
3055 if (LvlFactor > 1.0f)
3056 LvlFactor = 1.0f;
3057
3058 return AddPct(LvlFactor, -LvlPenalty);
3059}
uint8 GetLevel() const
Definition: Unit.h:855

References AddPct(), GetLevel(), Object::IsPlayer(), SpellInfo::MaxLevel, and SpellInfo::SpellLevel.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellDamageBonusDone(), SpellDamageBonusTaken(), and SpellHealingBonusDone().

◆ CalculateMeleeDamage()

void Unit::CalculateMeleeDamage ( Unit victim,
CalcDamageInfo damageInfo,
WeaponAttackType  attackType = BASE_ATTACK,
const bool  sittingVictim = false 
)
1465{
1466 damageInfo->attacker = this;
1467 damageInfo->target = victim;
1468
1469 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1470 {
1471 damageInfo->damages[i].damageSchoolMask = GetMeleeDamageSchoolMask(attackType, i);
1472 damageInfo->damages[i].damage = 0;
1473 damageInfo->damages[i].absorb = 0;
1474 damageInfo->damages[i].resist = 0;
1475 }
1476
1477 damageInfo->attackType = attackType;
1478 damageInfo->cleanDamage = 0;
1479 damageInfo->blocked_amount = 0;
1480
1481 damageInfo->TargetState = 0;
1482 damageInfo->HitInfo = 0;
1483 damageInfo->procAttacker = PROC_FLAG_NONE;
1484 damageInfo->procVictim = PROC_FLAG_NONE;
1485 damageInfo->procEx = PROC_EX_NONE;
1486 damageInfo->hitOutCome = MELEE_HIT_EVADE;
1487
1488 if (!victim)
1489 return;
1490
1491 if (!IsAlive() || !victim->IsAlive())
1492 return;
1493
1494 // Select HitInfo/procAttacker/procVictim flag based on attack type
1495 switch (attackType)
1496 {
1497 case BASE_ATTACK:
1500 break;
1501 case OFF_ATTACK:
1504 damageInfo->HitInfo = HITINFO_OFFHAND;
1505 break;
1506 default:
1507 return;
1508 }
1509
1510 // School Immune check
1511 uint8 immunedMask = 0;
1512 bool hasNonPhysicalSchoolMask = false;
1513 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1514 {
1516 {
1517 immunedMask |= (1 << i);
1519 {
1520 hasNonPhysicalSchoolMask = true;
1521 }
1522 }
1523 }
1524
1525 // School Immune check
1526 if (immunedMask & ((1 << 0) | (1 << 1)))
1527 {
1528 if (hasNonPhysicalSchoolMask || immunedMask == ((1 << 0) | (1 << 1)))
1529 {
1530 damageInfo->HitInfo |= HITINFO_NORMALSWING;
1531 damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE;
1532
1533 damageInfo->procEx |= PROC_EX_IMMUNE;
1534 return;
1535 }
1536 }
1537
1538 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1539 {
1540 // only players have secondary weapon damage
1541 if (i > 0 && !IsPlayer())
1542 {
1543 break;
1544 }
1545
1546 if (immunedMask & (1 << i))
1547 {
1548 continue;
1549 }
1550
1551 SpellSchoolMask schoolMask = SpellSchoolMask(damageInfo->damages[i].damageSchoolMask);
1552 bool const addPctMods = (schoolMask & SPELL_SCHOOL_MASK_NORMAL);
1553
1554 uint32 damage = 0;
1555 uint8 itemDamagesMask = (IsPlayer()) ? (1 << i) : 0;
1556
1557 damage += CalculateDamage(damageInfo->attackType, false, addPctMods, itemDamagesMask);
1558 // Add melee damage bonus
1559 damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType, nullptr, schoolMask);
1560 damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType, nullptr, schoolMask);
1561
1562 // Script Hook For CalculateMeleeDamage -- Allow scripts to change the Damage pre class mitigation calculations
1563 sScriptMgr->ModifyMeleeDamage(damageInfo->target, damageInfo->attacker, damage);
1564
1565 if (victim->GetAI())
1566 {
1567 victim->GetAI()->OnCalculateMeleeDamageReceived(damage, this);
1568 }
1569
1570 // Calculate armor reduction
1572 {
1573 damageInfo->damages[i].damage = Unit::CalcArmorReducedDamage(this, damageInfo->target, damage, nullptr, 0, damageInfo->attackType);
1574 damageInfo->cleanDamage += damage - damageInfo->damages[i].damage;
1575 }
1576 else
1577 {
1578 damageInfo->damages[i].damage = damage;
1579 }
1580 }
1581
1582 damageInfo->hitOutCome = RollMeleeOutcomeAgainst(damageInfo->target, damageInfo->attackType);
1583
1584 // If the victim was a sitting player and we didn't roll a miss, then crit.
1585 if (sittingVictim && damageInfo->hitOutCome != MELEE_HIT_MISS)
1586 {
1587 damageInfo->hitOutCome = MELEE_HIT_CRIT;
1588 }
1589 switch (damageInfo->hitOutCome)
1590 {
1591 case MELEE_HIT_EVADE:
1593 damageInfo->TargetState = VICTIMSTATE_EVADES;
1594 damageInfo->procEx |= PROC_EX_EVADE;
1595
1596 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1597 {
1598 damageInfo->damages[i].damage = 0;
1599 }
1600
1601 damageInfo->cleanDamage = 0;
1602 return;
1603 case MELEE_HIT_MISS:
1604 damageInfo->HitInfo |= HITINFO_MISS;
1605 damageInfo->TargetState = VICTIMSTATE_INTACT;
1606 damageInfo->procEx |= PROC_EX_MISS;
1607
1608 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1609 {
1610 damageInfo->damages[i].damage = 0;
1611 }
1612 damageInfo->cleanDamage = 0;
1613 break;
1614 case MELEE_HIT_NORMAL:
1615 damageInfo->TargetState = VICTIMSTATE_HIT;
1616 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1617 break;
1618 case MELEE_HIT_CRIT:
1619 {
1620 damageInfo->HitInfo |= HITINFO_CRITICALHIT;
1621 damageInfo->TargetState = VICTIMSTATE_HIT;
1622
1623 damageInfo->procEx |= PROC_EX_CRITICAL_HIT;
1624 // Crit bonus calc
1625 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1626 {
1627 damageInfo->damages[i].damage *= 2;
1628
1629 float mod = 0.0f;
1630 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1631 if (damageInfo->attackType == RANGED_ATTACK)
1632 {
1634 }
1635 else
1636 {
1638
1639 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1641 }
1642
1643 uint32 crTypeMask = damageInfo->target->GetCreatureTypeMask();
1644
1645 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1647 if (mod != 0)
1648 {
1649 AddPct(damageInfo->damages[i].damage, mod);
1650 }
1651 }
1652 break;
1653 }
1654 case MELEE_HIT_PARRY:
1655 damageInfo->TargetState = VICTIMSTATE_PARRY;
1656 damageInfo->procEx |= PROC_EX_PARRY;
1657 damageInfo->cleanDamage = 0;
1658
1659 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1660 {
1661 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1662 damageInfo->damages[i].damage = 0;
1663 }
1664 break;
1665 case MELEE_HIT_DODGE:
1666 damageInfo->TargetState = VICTIMSTATE_DODGE;
1667 damageInfo->procEx |= PROC_EX_DODGE;
1668 damageInfo->cleanDamage = 0;
1669
1670 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1671 {
1672 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1673 damageInfo->damages[i].damage = 0;
1674 }
1675 break;
1676 case MELEE_HIT_BLOCK:
1677 {
1678 damageInfo->TargetState = VICTIMSTATE_HIT;
1679 damageInfo->HitInfo |= HITINFO_BLOCK;
1680 damageInfo->procEx |= PROC_EX_BLOCK;
1681 damageInfo->blocked_amount = damageInfo->target->GetShieldBlockValue();
1682 // double blocked amount if block is critical
1683 if (damageInfo->target->isBlockCritical())
1684 damageInfo->blocked_amount += damageInfo->blocked_amount;
1685
1686 uint32 remainingBlock = damageInfo->blocked_amount;
1687 uint8 fullBlockMask = 0;
1688 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1689 {
1690 if (remainingBlock && remainingBlock >= damageInfo->damages[i].damage)
1691 {
1692 fullBlockMask |= (1 << i);
1693
1694 remainingBlock -= damageInfo->damages[i].damage;
1695 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1696 damageInfo->damages[i].damage = 0;
1697 }
1698 else
1699 {
1700 damageInfo->cleanDamage += remainingBlock;
1701 damageInfo->damages[i].damage -= remainingBlock;
1702 remainingBlock = 0;
1703 }
1704 }
1705
1706 // full block
1707 if (fullBlockMask == ((1 << 0) | (1 << 1)))
1708 {
1709 damageInfo->TargetState = VICTIMSTATE_BLOCKS;
1710 damageInfo->procEx |= PROC_EX_FULL_BLOCK;
1711 damageInfo->blocked_amount -= remainingBlock;
1712 }
1713 break;
1714 }
1715 case MELEE_HIT_GLANCING:
1716 {
1717 damageInfo->HitInfo |= HITINFO_GLANCING;
1718 damageInfo->TargetState = VICTIMSTATE_HIT;
1719 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1720 int32 leveldif = int32(victim->GetLevel()) - int32(GetLevel());
1721 if (leveldif > 3)
1722 leveldif = 3;
1723 float reducePercent = 1 - leveldif * 0.1f;
1724
1725 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1726 {
1727 uint32 reducedDamage = uint32(reducePercent * damageInfo->damages[i].damage);
1728 damageInfo->cleanDamage += damageInfo->damages[i].damage - reducedDamage;
1729 damageInfo->damages[i].damage = reducedDamage;
1730 }
1731 break;
1732 }
1733 case MELEE_HIT_CRUSHING:
1734 damageInfo->HitInfo |= HITINFO_CRUSHING;
1735 damageInfo->TargetState = VICTIMSTATE_HIT;
1736 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1737
1738 // 150% normal damage
1739 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1740 {
1741 damageInfo->damages[i].damage += (damageInfo->damages[i].damage / 2);
1742 }
1743 break;
1744 default:
1745 break;
1746 }
1747
1748 // Always apply HITINFO_AFFECTS_VICTIM in case its not a miss
1749 if (!(damageInfo->HitInfo & HITINFO_MISS))
1750 damageInfo->HitInfo |= HITINFO_AFFECTS_VICTIM;
1751
1752 uint32 tmpHitInfo[MAX_ITEM_PROTO_DAMAGES] = { };
1753
1754 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1755 {
1756 int32 dmg = damageInfo->damages[i].damage;
1757 int32 cleanDamage = damageInfo->cleanDamage;
1758 // attackType is checked already for BASE_ATTACK or OFF_ATTACK so it can't be RANGED_ATTACK here
1759 if (CanApplyResilience())
1760 {
1761 int32 resilienceReduction = damageInfo->damages[i].damage;
1762 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, (damageInfo->hitOutCome == MELEE_HIT_CRIT), CR_CRIT_TAKEN_MELEE);
1763
1764 resilienceReduction = damageInfo->damages[i].damage - resilienceReduction;
1765 dmg -= resilienceReduction;
1766 cleanDamage += resilienceReduction;
1767 }
1768
1769 damageInfo->damages[i].damage = std::max(0, dmg);
1770 damageInfo->cleanDamage = std::max(0, cleanDamage);
1771
1772 // Calculate absorb resist
1773 if (damageInfo->damages[i].damage > 0)
1774 {
1775 damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE;
1776
1777 // Calculate absorb & resists
1778 DamageInfo dmgInfo(*damageInfo, i);
1779 Unit::CalcAbsorbResist(dmgInfo);
1780 damageInfo->damages[i].absorb = dmgInfo.GetAbsorb();
1781 damageInfo->damages[i].resist = dmgInfo.GetResist();
1782
1783 if (damageInfo->damages[i].absorb)
1784 {
1785 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB);
1786 }
1787
1788 if (damageInfo->damages[i].resist)
1789 {
1790 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST);
1791 }
1792
1793 damageInfo->damages[i].damage = dmgInfo.GetDamage();
1794 }
1795 }
1796
1797 // set proper HitInfo flags
1798 if ((tmpHitInfo[0] & HITINFO_FULL_ABSORB) != 0)
1799 {
1800 // set partial absorb when secondary damage isn't full absorbed
1801 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_ABSORB) != 0) ? HITINFO_PARTIAL_ABSORB : HITINFO_FULL_ABSORB;
1802 }
1803 else
1804 {
1805 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_ABSORB);
1806 }
1807
1808 if ((tmpHitInfo[0] & HITINFO_FULL_RESIST) != 0)
1809 {
1810 // set partial resist when secondary damage isn't full resisted
1811 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_RESIST) != 0) ? HITINFO_PARTIAL_RESIST : HITINFO_FULL_RESIST;
1812 }
1813 else
1814 {
1815 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_RESIST);
1816 }
1817
1819 {
1820 damageInfo->procEx |= PROC_EX_ABSORB;
1821 }
1822
1823 if (damageInfo->HitInfo & HITINFO_FULL_RESIST)
1824 {
1825 damageInfo->procEx |= PROC_EX_RESIST;
1826 }
1827}
@ SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
Definition: SpellAuraDefines.h:232
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE
Definition: SpellAuraDefines.h:267
@ SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
Definition: SpellAuraDefines.h:226
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
Definition: SpellAuraDefines.h:266
@ PROC_EX_NONE
Definition: SpellMgr.h:193
@ PROC_EX_DODGE
Definition: SpellMgr.h:198
@ PROC_EX_BLOCK
Definition: SpellMgr.h:200
@ PROC_EX_CRITICAL_HIT
Definition: SpellMgr.h:195
@ PROC_EX_MISS
Definition: SpellMgr.h:196
@ PROC_EX_RESIST
Definition: SpellMgr.h:197
@ PROC_EX_FULL_BLOCK
Definition: SpellMgr.h:207
@ PROC_EX_ABSORB
Definition: SpellMgr.h:204
@ PROC_EX_PARRY
Definition: SpellMgr.h:199
@ PROC_EX_EVADE
Definition: SpellMgr.h:201
@ PROC_FLAG_DONE_MELEE_AUTO_ATTACK
Definition: SpellMgr.h:110
@ PROC_FLAG_DONE_MAINHAND_ATTACK
Definition: SpellMgr.h:140
@ PROC_FLAG_TAKEN_DAMAGE
Definition: SpellMgr.h:137
@ PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK
Definition: SpellMgr.h:111
@ PROC_FLAG_DONE_OFFHAND_ATTACK
Definition: SpellMgr.h:141
@ PROC_FLAG_NONE
Definition: SpellMgr.h:105
@ VICTIMSTATE_INTACT
Definition: Unit.h:83
@ VICTIMSTATE_HIT
Definition: Unit.h:84
@ VICTIMSTATE_DODGE
Definition: Unit.h:85
@ VICTIMSTATE_IS_IMMUNE
Definition: Unit.h:90
@ VICTIMSTATE_PARRY
Definition: Unit.h:86
@ VICTIMSTATE_BLOCKS
Definition: Unit.h:88
@ VICTIMSTATE_EVADES
Definition: Unit.h:89
@ HITINFO_PARTIAL_ABSORB
Definition: Unit.h:103
@ HITINFO_FULL_RESIST
Definition: Unit.h:104
@ HITINFO_NORMALSWING
Definition: Unit.h:96
@ HITINFO_BLOCK
Definition: Unit.h:110
@ HITINFO_CRUSHING
Definition: Unit.h:114
@ HITINFO_SWINGNOHITSOUND
Definition: Unit.h:118
@ HITINFO_MISS
Definition: Unit.h:101
@ HITINFO_FULL_ABSORB
Definition: Unit.h:102
@ HITINFO_OFFHAND
Definition: Unit.h:99
@ HITINFO_GLANCING
Definition: Unit.h:113
@ HITINFO_CRITICALHIT
Definition: Unit.h:106
@ HITINFO_PARTIAL_RESIST
Definition: Unit.h:105
@ HITINFO_AFFECTS_VICTIM
Definition: Unit.h:98
@ MELEE_HIT_CRUSHING
Definition: Unit.h:286
@ MELEE_HIT_BLOCK
Definition: Unit.h:285
@ MELEE_HIT_CRIT
Definition: Unit.h:286
@ MELEE_HIT_EVADE
Definition: Unit.h:285
@ MELEE_HIT_DODGE
Definition: Unit.h:285
@ MELEE_HIT_MISS
Definition: Unit.h:285
@ MELEE_HIT_PARRY
Definition: Unit.h:285
@ MELEE_HIT_GLANCING
Definition: Unit.h:286
virtual void OnCalculateMeleeDamageReceived(uint32 &, Unit *)
Called during damage calculations.
Definition: UnitAI.h:381
uint32 damageSchoolMask
Definition: Unit.h:469
uint32 blocked_amount
Definition: Unit.h:475
MeleeHitOutcome hitOutCome
Definition: Unit.h:484
uint32 cleanDamage
Definition: Unit.h:483
uint32 TargetState
Definition: Unit.h:477
uint32 resist
Definition: Unit.h:472
uint32 HitInfo
Definition: Unit.h:476
bool isBlockCritical()
Definition: Unit.cpp:3126
uint32 MeleeDamageBonusTaken(Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition: Unit.cpp:13262
virtual SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:5961
bool CanApplyResilience() const
Definition: Unit.h:1750
uint32 CalculateDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
Definition: Unit.cpp:2984
virtual uint32 GetShieldBlockValue() const =0
static void ApplyResilience(Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
Definition: Unit.cpp:18914
UnitAI * GetAI()
Definition: Unit.h:658
static bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
Definition: Unit.cpp:2008
int32 GetTotalAuraModifier(AuraType auratype) const
Definition: Unit.cpp:5910
MeleeHitOutcome RollMeleeOutcomeAgainst(Unit const *victim, WeaponAttackType attType) const
Definition: Unit.cpp:2781
uint32 GetCreatureTypeMask() const
Definition: Unit.h:976
uint32 MeleeDamageBonusDone(Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition: Unit.cpp:13060

References CalcDamageInfo::absorb, AddPct(), CalcDamageInfo::attacker, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcArmorReducedDamage(), CalculateDamage(), CalcDamageInfo::cleanDamage, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, GetAI(), GetCreatureTypeMask(), GetLevel(), GetMeleeDamageSchoolMask(), GetShieldBlockValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplierByMiscMask(), CalcDamageInfo::HitInfo, HITINFO_AFFECTS_VICTIM, HITINFO_BLOCK, HITINFO_CRITICALHIT, HITINFO_CRUSHING, HITINFO_GLANCING, HITINFO_MISS, HITINFO_NORMALSWING, HITINFO_OFFHAND, HITINFO_SWINGNOHITSOUND, CalcDamageInfo::hitOutCome, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, MeleeDamageBonusDone(), MeleeDamageBonusTaken(), OFF_ATTACK, UnitAI::OnCalculateMeleeDamageReceived(), PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_EVADE, PROC_EX_FULL_BLOCK, PROC_EX_IMMUNE, PROC_EX_MISS, PROC_EX_NONE, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_MELEE_AUTO_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_NONE, PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK, CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RANGED_ATTACK, CalcDamageInfo::resist, RollMeleeOutcomeAgainst(), SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_SCHOOL_MASK_NORMAL, sScriptMgr, CalcDamageInfo::target, CalcDamageInfo::TargetState, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, VICTIMSTATE_EVADES, VICTIMSTATE_HIT, VICTIMSTATE_INTACT, VICTIMSTATE_IS_IMMUNE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ CalculateMinMaxDamage()

virtual void Unit::CalculateMinMaxDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
float &  minDamage,
float &  maxDamage,
uint8  damageIndex = 0 
)
pure virtual

Implemented in Creature, and Player.

Referenced by CalculateDamage(), and UpdateDamagePhysical().

◆ CalculateSpellDamage()

int32 Unit::CalculateSpellDamage ( Unit const *  target,
SpellInfo const *  spellProto,
uint8  effect_index,
int32 const *  basePoints = nullptr 
) const

◆ CalculateSpellDamageTaken()

void Unit::CalculateSpellDamageTaken ( SpellNonMeleeDamage damageInfo,
int32  damage,
SpellInfo const *  spellInfo,
WeaponAttackType  attackType = BASE_ATTACK,
bool  crit = false 
)
1296{
1297 if (damage < 0)
1298 return;
1299
1300 Unit* victim = damageInfo->target;
1301 if (!victim || !victim->IsAlive())
1302 return;
1303
1304 SpellSchoolMask damageSchoolMask = SpellSchoolMask(damageInfo->schoolMask);
1305 uint32 crTypeMask = victim->GetCreatureTypeMask();
1306
1307 // Script Hook For CalculateSpellDamageTaken -- Allow scripts to change the Damage post class mitigation calculations
1308 sScriptMgr->ModifySpellDamageTaken(damageInfo->target, damageInfo->attacker, damage, spellInfo);
1309
1310 if (victim->GetAI())
1311 {
1312 victim->GetAI()->OnCalculateSpellDamageReceived(damage, this);
1313 }
1314
1315 int32 cleanDamage = 0;
1316 if (Unit::IsDamageReducedByArmor(damageSchoolMask, spellInfo))
1317 {
1318 int32 oldDamage = damage;
1319 damage = Unit::CalcArmorReducedDamage(this, victim, damage, spellInfo, 0, attackType);
1320 cleanDamage = oldDamage - damage;
1321 }
1322
1323 bool blocked = false;
1324 // Per-school calc
1325 switch (spellInfo->DmgClass)
1326 {
1327 // Melee and Ranged Spells
1330 {
1331 // Physical Damage
1332 if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)
1333 {
1334 // Get blocked status
1335 blocked = isSpellBlocked(victim, spellInfo, attackType);
1336 }
1337
1338 if (crit)
1339 {
1340 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1341
1342 // Calculate crit bonus
1343 uint32 crit_bonus = damage;
1344 // Apply crit_damage bonus for melee spells
1345 if (Player* modOwner = GetSpellModOwner())
1346 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
1347 damage += crit_bonus;
1348
1349 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1350 float critPctDamageMod = 0.0f;
1351 if (attackType == RANGED_ATTACK)
1353 else
1355
1356 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1357 critPctDamageMod += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellInfo->GetSchoolMask());
1358
1359 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1361
1362 if (critPctDamageMod != 0)
1363 AddPct(damage, critPctDamageMod);
1364 }
1365
1366 // Spell weapon based damage CAN BE crit & blocked at same time
1367 if (blocked)
1368 {
1369 damageInfo->blocked = victim->GetShieldBlockValue();
1370 // double blocked amount if block is critical
1371 if (victim->isBlockCritical())
1372 damageInfo->blocked *= 2;
1373 if (damage < int32(damageInfo->blocked))
1374 damageInfo->blocked = uint32(damage);
1375
1376 damage -= damageInfo->blocked;
1377 cleanDamage += damageInfo->blocked;
1378 }
1379
1380 int32 resilienceReduction = damage;
1381 if (CanApplyResilience())
1382 {
1383 if (attackType != RANGED_ATTACK)
1384 {
1385 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_MELEE);
1386 }
1387 else
1388 {
1389 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_RANGED);
1390 }
1391 }
1392
1393 resilienceReduction = damage - resilienceReduction;
1394 damage -= resilienceReduction;
1395 cleanDamage += resilienceReduction;
1396 break;
1397 }
1398 // Magical Attacks
1401 {
1402 // If crit add critical bonus
1403 if (crit)
1404 {
1405 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1406 damage = Unit::SpellCriticalDamageBonus(this, spellInfo, damage, victim);
1407 }
1408
1409 int32 resilienceReduction = damage;
1410 if (CanApplyResilience())
1411 {
1412 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_SPELL);
1413 }
1414
1415 resilienceReduction = damage - resilienceReduction;
1416 damage -= resilienceReduction;
1417 cleanDamage += resilienceReduction;
1418 break;
1419 }
1420 default:
1421 break;
1422 }
1423
1424 damageInfo->cleanDamage = std::max(0, cleanDamage);
1425 damageInfo->damage = std::max(0, damage);
1426
1427 // Calculate absorb resist
1428 if (damageInfo->damage > 0)
1429 {
1430 DamageInfo dmgInfo(*damageInfo, SPELL_DIRECT_DAMAGE);
1431 Unit::CalcAbsorbResist(dmgInfo);
1432 damageInfo->absorb = dmgInfo.GetAbsorb();
1433 damageInfo->resist = dmgInfo.GetResist();
1434 damageInfo->damage = dmgInfo.GetDamage();
1435 }
1436}
@ SPELLMOD_CRIT_DAMAGE_BONUS
Definition: SpellDefines.h:91
@ SPELL_DIRECT_DAMAGE
Definition: Unit.h:249
@ SPELL_DAMAGE_CLASS_RANGED
Definition: SharedDefines.h:1548
@ SPELL_DAMAGE_CLASS_MAGIC
Definition: SharedDefines.h:1546
@ SPELL_DAMAGE_CLASS_NONE
Definition: SharedDefines.h:1545
@ SPELL_DAMAGE_CLASS_MELEE
Definition: SharedDefines.h:1547
@ SPELL_HIT_TYPE_CRIT
Definition: SharedDefines.h:1536
virtual void OnCalculateSpellDamageReceived(int32 &, Unit *)
Definition: UnitAI.h:382
Unit * target
Definition: Unit.h:495
uint32 HitInfo
Definition: Unit.h:506
uint32 damage
Definition: Unit.h:498
uint32 absorb
Definition: Unit.h:501
Unit * attacker
Definition: Unit.h:496
uint32 schoolMask
Definition: Unit.h:500
uint32 cleanDamage
Definition: Unit.h:508
uint32 resist
Definition: Unit.h:502
uint32 blocked
Definition: Unit.h:505
bool isSpellBlocked(Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
Definition: Unit.cpp:3100
static uint32 SpellCriticalDamageBonus(Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
Definition: Unit.cpp:12267

References SpellNonMeleeDamage::absorb, AddPct(), ApplyResilience(), SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CalcAbsorbResist(), CalcArmorReducedDamage(), CanApplyResilience(), SpellNonMeleeDamage::cleanDamage, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, SpellNonMeleeDamage::damage, SpellInfo::DmgClass, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), DamageInfo::GetResist(), SpellInfo::GetSchoolMask(), GetShieldBlockValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), isSpellBlocked(), UnitAI::OnCalculateSpellDamageReceived(), RANGED_ATTACK, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_DIRECT_DAMAGE, SPELL_HIT_TYPE_CRIT, SPELL_SCHOOL_MASK_NORMAL, SpellCriticalDamageBonus(), SPELLMOD_CRIT_DAMAGE_BONUS, sScriptMgr, and SpellNonMeleeDamage::target.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ CanApplyResilience()

◆ CanDualWield()

◆ CanEnterWater()

virtual bool Unit::CanEnterWater ( ) const
pure virtual

Implemented in Creature, and Player.

◆ CanFly()

◆ CanFreeMove()

bool Unit::CanFreeMove ( ) const
inline
939 {
942 }
@ UNIT_STATE_DISTRACTED
Definition: UnitDefines.h:161
@ UNIT_STATE_CONFUSED
Definition: UnitDefines.h:160
@ UNIT_STATE_FLEEING
Definition: UnitDefines.h:156
@ UNIT_STATE_IN_FLIGHT
Definition: UnitDefines.h:157
@ UNIT_STATE_STUNNED
Definition: UnitDefines.h:152

References GetOwnerGUID(), HasUnitState(), UNIT_STATE_CONFUSED, UNIT_STATE_DISTRACTED, UNIT_STATE_FLEEING, UNIT_STATE_IN_FLIGHT, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by SpellInfo::CheckTarget(), and Creature::IsFreeToMove().

◆ CanHaveThreatList()

bool Unit::CanHaveThreatList ( bool  skipAliveCheck = false) const
14601{
14602 // only creatures can have threat list
14603 if (!IsCreature())
14604 return false;
14605
14606 // only alive units can have threat list
14607 if (!skipAliveCheck && !IsAlive())
14608 return false;
14609
14610 // totems can not have threat list
14611 if (ToCreature()->IsTotem())
14612 return false;
14613
14614 // vehicles can not have threat list
14615 if (ToCreature()->IsVehicle() && GetMap()->IsBattlegroundOrArena())
14616 return false;
14617
14618 // summons can not have a threat list, unless they are controlled by a creature
14620 return false;
14621
14622 return true;
14623}
@ UNIT_MASK_CONTROLABLE_GUARDIAN
Definition: UnitDefines.h:143
@ UNIT_MASK_GUARDIAN
Definition: UnitDefines.h:137
Map * GetMap() const
Definition: Object.h:531
bool IsVehicle() const
Definition: Unit.h:713

References WorldObject::GetMap(), GetOwnerGUID(), HasUnitTypeMask(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), IsTotem(), IsVehicle(), Object::ToCreature(), UNIT_MASK_CONTROLABLE_GUARDIAN, UNIT_MASK_GUARDIAN, and UNIT_MASK_MINION.

Referenced by AddThreat(), Creature::CanPeriodicallyCallForAssistance(), ThreatMgr::ClearAllThreat(), DealDamage(), ScriptedAI::DoResetThreatList(), CreatureAI::DoZoneInCombat(), Spell::EffectTaunt(), Spell::EffectThreat(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleModTaunt(), Spell::HandleThreatSpells(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), Creature::SelectVictim(), TauntApply(), TauntFadeOut(), and Update().

◆ CanInstantCast()

bool Unit::CanInstantCast ( ) const
inline
1760{ return _instantCast; }

References _instantCast.

Referenced by ModSpellCastTime().

◆ CanModifyStats()

◆ CanProc()

bool Unit::CanProc ( )
inline
1673{ return !m_procDeep; }

References m_procDeep.

Referenced by Spell::DoAllEffectOnTarget().

◆ CanRestoreMana()

bool Unit::CanRestoreMana ( SpellInfo const *  spellInfo) const
21220{
21221 // Aura of Despair exceptions
21222 switch (spellInfo->Id)
21223 {
21224 case 16666: // Demonic Rune
21225 case 27869: // Dark Rune
21226 case 30824: // Shamanistic Rage
21227 case 31786: // Spiritual Attunement
21228 case 31930: // Judgements of the Wise
21229 case 34075: // Aspect of the Viper
21230 case 34720: // Thrill of the hunt
21231 case 47755: // Rapture
21232 case 54425: // Improved Felhunter
21233 case 57319: // Blessing of Sanctuary
21234 case 63337: // Saronite Vapors (regenerate mana)
21235 case 63375: // Improved stormstrike
21236 case 64372: // Lifebloom
21237 case 68285: // Improved Leader of the Pack
21238 return true;
21239 case 54428: // Divine Plea - only with talent Guarded by the Light
21240 return HasSpell(53583);
21241 default:
21242 break;
21243 }
21244
21245 return false;
21246}
virtual bool HasSpell(uint32) const
Definition: Unit.h:1111

References HasSpell(), and SpellInfo::Id.

Referenced by IsImmunedToSpellEffect().

◆ CanSwim()

bool Unit::CanSwim ( ) const
virtual

this method checks the current flag of a unit

These flags can be set within the database or dynamically changed at runtime UNIT_FLAG_SWIMMING must be updated when a unit enters a swimmable area

Reimplemented in Creature.

19953{
19954 // Mirror client behavior, if this method returns false then client will not use swimming animation and for players will apply gravity as if there was no water
19956 return false;
19958 return true;
19960 return false;
19962 return true;
19964}
@ UNIT_FLAG2_UNUSED_6
Definition: UnitDefines.h:286
@ UNIT_FLAG_CANNOT_SWIM
Definition: UnitDefines.h:243
@ UNIT_FLAG_POSSESSED
Definition: UnitDefines.h:253
@ UNIT_FLAG_SWIMMING
Definition: UnitDefines.h:244
@ UNIT_FLAG_RENAME
Definition: UnitDefines.h:233
@ UNIT_FLAG_PET_IN_COMBAT
Definition: UnitDefines.h:240
bool HasUnitFlag2(UnitFlags2 flags) const
Definition: Unit.h:688

References HasUnitFlag(), HasUnitFlag2(), UNIT_FLAG2_UNUSED_6, UNIT_FLAG_CANNOT_SWIM, UNIT_FLAG_PET_IN_COMBAT, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_POSSESSED, UNIT_FLAG_RENAME, and UNIT_FLAG_SWIMMING.

Referenced by Creature::CanSwim().

◆ CanUseAttackType()

◆ CastCustomSpell() [1/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
CustomSpellValues const &  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1251{
1252 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1253 if (!spellInfo)
1254 {
1255 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1257 }
1258
1259 SpellCastTargets targets;
1260 targets.SetUnitTarget(victim);
1261
1262 return CastSpell(targets, spellInfo, &value, triggerFlags, castItem, triggeredByAura, originalCaster);
1263}
#define LOG_ERROR(filterType__,...)
Definition: Log.h:156
@ SPELL_FAILED_SPELL_UNAVAILABLE
Definition: SharedDefines.h:1056
Definition: Spell.h:109
void SetUnitTarget(Unit *target)
Definition: Spell.cpp:238

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetUnitTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastCustomSpell() [2/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1237{
1238 CustomSpellValues values;
1239 values.AddSpellMod(mod, value);
1240 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1241}
@ TRIGGERED_NONE
Definition: SpellDefines.h:130
SpellCastResult CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1224
Definition: SpellDefines.h:162
void AddSpellMod(SpellValueMod mod, int32 value)
Definition: SpellDefines.h:164

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastCustomSpell() [3/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1244{
1245 CustomSpellValues values;
1246 values.AddSpellMod(mod, value);
1247 return CastCustomSpell(spellId, values, target, triggerFlags, castItem, triggeredByAura, originalCaster);
1248}

References CustomSpellValues::AddSpellMod(), and CastCustomSpell().

◆ CastCustomSpell() [4/4]

SpellCastResult Unit::CastCustomSpell ( Unit victim,
uint32  spellId,
int32 const *  bp0,
int32 const *  bp1,
int32 const *  bp2,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1225{
1226 CustomSpellValues values;
1227 if (bp0)
1228 values.AddSpellMod(SPELLVALUE_BASE_POINT0, *bp0);
1229 if (bp1)
1230 values.AddSpellMod(SPELLVALUE_BASE_POINT1, *bp1);
1231 if (bp2)
1232 values.AddSpellMod(SPELLVALUE_BASE_POINT2, *bp2);
1233 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1234}
@ SPELLVALUE_BASE_POINT1
Definition: SpellDefines.h:114
@ SPELLVALUE_BASE_POINT2
Definition: SpellDefines.h:115
@ SPELLVALUE_BASE_POINT0
Definition: SpellDefines.h:113

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), SPELLVALUE_BASE_POINT0, SPELLVALUE_BASE_POINT1, SPELLVALUE_BASE_POINT2, TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

Referenced by spell_pri_guardian_spirit::Absorb(), spell_mage_fire_frost_ward::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_the_lich_king_necrotic_plague_jump_aura::AfterDispel(), spell_dru_lifebloom::AfterRemove(), Player::ApplyEnchantment(), Player::ApplyEquipSpell(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), npc_gas_cloud::npc_gas_cloudAI::CastMainSpell(), CastPetAura(), spell_ruby_sanctum_rallying_shout::CountAllies(), spell_igb_rocket_artillery_explosion::DamageGunship(), boss_illidari_council_memberAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), Spell::EffectDestroyAllTotems(), Spell::EffectDispel(), Spell::EffectFeedPet(), Spell::EffectForceCast(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonType(), EnterVehicle(), EnterVehicleUnattackable(), AuraMunchingQueue::Execute(), TriggerWickedSpirit::Execute(), spell_sha_totem_of_wrath::HandleAfterCast(), spell_reflective_shield_aura::HandleAfterEffectAbsorb(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_pri_shadow_word_death::HandleDamage(), spell_dk_corpse_explosion::HandleDamage(), spell_dru_lifebloom::HandleDispel(), spell_igb_burning_pitch::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_deathbringer_blood_link::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_gen_dummy_trigger::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_pal_divine_storm_dummy::HandleDummy(), spell_sha_ancestral_awakening_proc::HandleDummy(), spell_sha_cleansing_totem_pulse::HandleDummy(), spell_warl_life_tap::HandleDummy(), spell_warr_last_stand::HandleDummy(), spell_warr_charge::HandleDummy(), spell_warr_slam::HandleDummy(), spell_warr_bloodthirst::HandleDummy(), HandleDummyAuraProc(), spell_egg_explosion::HandleDummyHitTarget(), spell_warr_execute::HandleEffect(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_serpentshrine_cavern_infection::HandleEffectRemove(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_ragin_flames_inferno::HandlePeriodic(), spell_dk_death_and_decay_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_deathbringer_blood_link_aura::HandleProc(), spell_deathbringer_blood_link_blood_beast_aura::HandleProc(), spell_reliquary_of_souls_aura_of_desire_aura::HandleProc(), spell_black_temple_consuming_strikes_aura::HandleProc(), spell_item_blade_ward_enchant::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), spell_dru_living_seed_proc::HandleProc(), spell_hun_ascpect_of_the_viper::HandleProc(), spell_sha_earth_shield::HandleProc(), spell_the_lich_king_dark_hunger_aura::HandleProc(), spell_yogg_saron_grim_reprisal_aura::HandleProc(), spell_dk_wandering_plague_aura::HandleProc(), spell_dk_blood_gorged::HandleProc(), spell_dru_living_seed::HandleProc(), spell_gen_blade_warding::HandleProc(), spell_hun_glyph_of_arcane_shot::HandleProc(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_item_necrotic_touch::HandleProc(), spell_mage_burnout::HandleProc(), spell_pal_seal_of_command_aura::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pal_seal_of_righteousness::HandleProc(), spell_pri_divine_aegis::HandleProc(), spell_pri_glyph_of_prayer_of_healing::HandleProc(), spell_rog_blade_flurry::HandleProc(), spell_sha_item_mana_surge::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellWithValueAuraProc(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_igb_rocket_pack_aura::HandleRemove(), spell_warl_haunt_aura::HandleRemove(), spell_pal_lay_on_hands::HandleScript(), spell_kelthuzad_detonate_mana_aura::HandleScript(), spell_q12919_gymers_grab::HandleScript(), spell_gluth_decimate::HandleScriptEffect(), spell_hun_chimera_shot::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), spell_illidari_council_circle_of_healing::HandleSharedRule(), HandleSpellClick(), boss_akilzon::boss_akilzonAI::HandleStormSequence(), spell_halion_damage_aoe_summon::HandleSummon(), spell_putricide_mutated_transformation::HandleSummon(), spell_putricide_mutated_plague_aura::HandleTriggerSpell(), boss_essence_of_suffering::boss_essence_of_sufferingAI::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_mother_shahraz::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_najentus::JustEngagedWith(), boss_morogrim_tidewalker::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_frost_tomb::npc_frost_tombAI::npc_frost_tombAI(), spell_dru_tiger_s_fury::OnHit(), spell_gen_flurry_of_claws::OnPeriodic(), spell_blood_queen_essence_of_the_blood_queen_aura::OnProc(), spell_pal_eye_for_an_eye::OnProc(), spell_warl_siphon_life::OnProc(), spell_warl_fel_synergy::OnProc(), spell_warr_improved_spell_reflection::OnProc(), spell_warr_damage_shield::OnProc(), spell_kalecgos_curse_of_boundless_agony_aura::OnRemove(), spell_halion_marks_aura::OnRemove(), spell_putricide_mutated_plague_aura::OnRemove(), spell_the_lich_king_necrotic_plague_aura::OnRemove(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), spell_sindragosa_instability_aura::OnRemove(), spell_the_lich_king_necrotic_plague_jump_aura::OnRemove(), spell_karazhan_overload_aura::PeriodicTick(), spell_doomfire::PeriodicTick(), spell_blood_queen_pact_of_the_darkfallen_dmg_aura::PeriodicTick(), spell_broggok_poison_cloud::PeriodicTick(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11198_take_down_tethyr::PrepareSpellScript(), spell_illidari_council_reflective_shield_aura::ReflectDamage(), spell_pri_power_word_shield_aura::ReflectDamage(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), boss_magtheridon::ScheduleCombatEvents(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), boss_viscidus::SummonedCreatureDies(), spell_dk_anti_magic_shell_self::Trigger(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), spell_the_lich_king_life_siphon::TriggerHeal(), spell_pal_divine_storm::TriggerHeal(), spell_black_temple_shadow_inferno_aura::Update(), spell_black_temple_spell_absorption_aura::Update(), boss_felblood_kaelthas::UpdateAI(), boss_alythess::boss_alythessAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_sathrovarr::boss_sathrovarrAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_coren_direbrew::UpdateAI(), boss_huhuran::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_living_constellation::npc_living_constellationAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), and boss_toravon::boss_toravonAI::UpdateAI().

◆ CastDelayedSpellWithPeriodicAmount()

void Unit::CastDelayedSpellWithPeriodicAmount ( Unit caster,
uint32  spellId,
AuraType  auraType,
int32  addAmount,
uint8  effectIndex = 0 
)
20294{
20295 AuraEffect* aurEff = nullptr;
20296 for (AuraEffectList::iterator i = m_modAuras[auraType].begin(); i != m_modAuras[auraType].end(); ++i)
20297 {
20298 aurEff = *i;
20299 if (aurEff->GetCasterGUID() != caster->GetGUID() || aurEff->GetId() != spellId || aurEff->GetEffIndex() != effectIndex || !aurEff->GetTotalTicks())
20300 continue;
20301
20302 addAmount += ((aurEff->GetOldAmount() * std::max<int32>(aurEff->GetTotalTicks() - int32(aurEff->GetTickNumber()), 0)) / aurEff->GetTotalTicks());
20303 break;
20304 }
20305
20306 // xinef: delay only for casting on different unit
20307 if (this == caster || !sWorld->getBoolConfig(CONFIG_MUNCHING_BLIZZLIKE))
20308 caster->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, addAmount, this, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_NO_PERIODIC_RESET), nullptr, aurEff, caster->GetGUID());
20309 else
20310 caster->m_Events.AddEvent(new AuraMunchingQueue(*caster, GetGUID(), addAmount, spellId, aurEff, auraType), caster->m_Events.CalculateQueueTime(400));
20311}
TriggerCastFlags
Definition: SpellDefines.h:129
@ TRIGGERED_NO_PERIODIC_RESET
Will ignore equipped item requirements.
Definition: SpellDefines.h:149
@ CONFIG_MUNCHING_BLIZZLIKE
Definition: IWorld.h:184
uint64 CalculateQueueTime(uint64 delay) const
Definition: EventProcessor.cpp:164
Definition: Unit.cpp:20260
uint32 GetTickNumber() const
Definition: SpellAuraEffects.h:87
int32 GetOldAmount() const
Definition: SpellAuraEffects.h:116
uint32 GetId() const
Definition: SpellAuraEffects.cpp:432
int32 GetTotalTicks() const
Definition: SpellAuraEffects.cpp:7365
ObjectGuid GetCasterGUID() const
Definition: SpellAuraEffects.h:48

References EventProcessor::AddEvent(), EventProcessor::CalculateQueueTime(), CastCustomSpell(), CONFIG_MUNCHING_BLIZZLIKE, AuraEffect::GetCasterGUID(), AuraEffect::GetEffIndex(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetOldAmount(), AuraEffect::GetTickNumber(), AuraEffect::GetTotalTicks(), m_Events, m_modAuras, SPELLVALUE_BASE_POINT0, sWorld, TRIGGERED_FULL_MASK, and TRIGGERED_NO_PERIODIC_RESET.

Referenced by HandleDummyAuraProc(), spell_mage_ignite::HandleProc(), spell_dru_t10_balance_4p_bonus::HandleProc(), spell_sha_t10_restoration_4p_bonus::HandleProc(), spell_sha_t8_electrified::HandleProc(), and HandleProcTriggerSpell().

◆ CastPetAura()

void Unit::CastPetAura ( PetAura const *  aura)
17309{
17310 uint32 auraId = aura->GetAura(GetEntry());
17311 if (!auraId)
17312 return;
17313
17314 if (auraId == 35696) // Demonic Knowledge
17315 {
17316 int32 basePoints = aura->GetDamage();
17317 CastCustomSpell(this, auraId, &basePoints, nullptr, nullptr, true);
17318 }
17319 else
17320 CastSpell(this, auraId, true);
17321}

References CastCustomSpell(), CastSpell(), PetAura::GetAura(), PetAura::GetDamage(), and Object::GetEntry().

Referenced by Pet::CastPetAuras().

◆ CastSpell() [1/7]

SpellCastResult Unit::CastSpell ( float  x,
float  y,
float  z,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1266{
1267 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1268 if (!spellInfo)
1269 {
1270 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1272 }
1273
1274 SpellCastTargets targets;
1275 targets.SetDst(x, y, z, GetOrientation());
1276
1277 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1278}
void SetDst(float x, float y, float z, float orientation, uint32 mapId=MAPID_INVALID)
Definition: Spell.cpp:405

References CastSpell(), Object::GetGUID(), Position::GetOrientation(), LOG_ERROR, SpellCastTargets::SetDst(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [2/7]

SpellCastResult Unit::CastSpell ( GameObject go,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1281{
1282 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1283 if (!spellInfo)
1284 {
1285 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1287 }
1288
1289 SpellCastTargets targets;
1290 targets.SetGOTarget(go);
1291
1292 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1293}
void SetGOTarget(GameObject *target)
Definition: Spell.cpp:270

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetGOTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [3/7]

SpellCastResult Unit::CastSpell ( SpellCastTargets const &  targets,
SpellInfo const *  spellInfo,
CustomSpellValues const *  value,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
Todo:
: this is a workaround - not needed anymore, but required for some scripts :(
1168{
1169 if (!spellInfo)
1170 {
1171 LOG_ERROR("entities.unit", "CastSpell: unknown spell by caster {}", GetGUID().ToString());
1173 }
1174
1176 if (!originalCaster && triggeredByAura)
1177 {
1178 originalCaster = triggeredByAura->GetCasterGUID();
1179 }
1180
1181 Spell* spell = new Spell(this, spellInfo, triggerFlags, originalCaster);
1182
1183 if (value)
1184 {
1185 for (CustomSpellValues::const_iterator itr = value->begin(); itr != value->end(); ++itr)
1186 {
1187 spell->SetSpellValue(itr->first, itr->second);
1188 }
1189 }
1190
1191 spell->m_CastItem = castItem;
1192 return spell->prepare(&targets, triggeredByAura);
1193}
void SetSpellValue(SpellValueMod mod, int32 value)
Definition: Spell.cpp:8432
Item * m_CastItem
Definition: Spell.h:521

References AuraEffect::GetCasterGUID(), Object::GetGUID(), LOG_ERROR, Spell::m_CastItem, Spell::prepare(), Spell::SetSpellValue(), SPELL_FAILED_SPELL_UNAVAILABLE, and Position::ToString().

Referenced by Player::_addSpell(), Player::_addTalentAurasAndSpells(), Spell::_cast(), _ExitVehicle(), Player::_LoadGlyphAuras(), Battleground::_ProcessResurrect(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_rog_cheat_death::Absorb(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Activate(), Player::ActivateSpec(), spell_halion_combustion_consumption_aura::AddMarkStack(), Battleground::AddPlayer(), Arena::AddPlayer(), BattlegroundIC::AddPlayer(), BattlegroundMap::AddPlayerToMap(), Battleground::AddPlayerToResurrectQueue(), Pet::addSpell(), spell_dru_barkskin::AfterApply(), spell_dru_savage_roar_aura::AfterApply(), spell_astromancer_wrath_of_the_astromancer::AfterRemove(), spell_gen_lifebloom::AfterRemove(), spell_oculus_stop_time_aura::Apply(), spell_sha_earthbind_totem::Apply(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyEnchantment(), spell_hun_lock_and_load::ApplyMarker(), npc_mograine::npc_mograineAI::AshbringerEvent(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::boss_yoggsaron_crusher_tentacleAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::boss_yoggsaron_death_orbAI(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::boss_yoggsaron_influence_tentacleAI(), Player::BuildPlayerRepop(), spell_igb_incinerating_blast::CalculateDamage(), spell_igb_cannon_blast::CalculatePower(), npc_echo_of_medivh::CastChangeFacing(), npc_chesspiece::CastChangeFacing(), CastCustomSpell(), npc_hallows_end_soh::CastFires(), Player::CastItemCombatSpell(), npc_volatile_ooze::npc_volatile_oozeAI::CastMainSpell(), CastPetAura(), boss_mor_grayhoof::CastRandomSpell(), GameObject::CastSpell(), CastSpell(), spell_the_lich_king_defile::ChangeDamageAndGrow(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), spell_eredar_twins_handle_touch::CheckCast(), Spell::CheckItems(), spell_botanica_shift_form_aura::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), spell_the_lich_king_shadow_trap_periodic::CheckTargetCount(), spell_dk_raise_dead::ConsumeReagents(), spell_frost_giant_death_plague::CountTargets(), instance_blackrock_spire::instance_blackrock_spireMapScript::CreatureLooted(), violet_hold_trashAI::CreatureStartAttackDoor(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), npc_mograine::npc_mograineAI::DamageTaken(), boss_muru::boss_muruAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), DealMeleeDamage(), spell_warl_seed_of_corruption_aura::Detonate(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_twin_valkyrAI::DoAction(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_icc_severed_essence::npc_icc_severed_essenceAI::DoAction(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), npc_eris_hevenfire::npc_eris_hevenfireAI::DoAction(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_flame_leviathan::boss_flame_leviathanAI::DoAction(), boss_magtheridon::DoAction(), boss_sacrolash::boss_sacrolashAI::DoAction(), boss_alythess::boss_alythessAI::DoAction(), boss_kalecgos::boss_kalecgosAI::DoAction(), boss_sathrovarr::boss_sathrovarrAI::DoAction(), npc_kalecgos_kj::npc_kalecgos_kjAI::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_black_knight::boss_black_knightAI::DoAction(), boss_jormungarAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_icc_blood_beast::npc_icc_blood_beastAI::DoAction(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_molten_golem::npc_molten_golemAI::DoAction(), boss_steelbreaker::boss_steelbreakerAI::DoAction(), npc_ulduar_bot_summon_trigger::npc_ulduar_bot_summon_triggerAI::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DoAction(), boss_yoggsaron_keeper::DoAction(), Spell::DoAllEffectOnTarget(), UnitAI::DoCast(), UnitAI::DoCastAOE(), ScriptedAI::DoCastSpell(), InstanceScript::DoCastSpellOnPlayer(), InstanceScript::DoCastSpellOnPlayers(), UnitAI::DoCastToAllHostilePlayers(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), npc_midsummer_ribbon_pole_target::DoFireworkChecks(), npc_midsummer_ribbon_pole_target::DoGroundFlowerChecks(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), npc_midsummer_ribbon_pole_target::DoSpewLavaChecks(), boss_skeram::DoTeleport(), Spell::DoTriggersOnSpellHit(), Player::DuelComplete(), Spell::EffectActivateRune(), Spell::EffectApplyGlyph(), Spell::EffectCastButtons(), Spell::EffectDummy(), Spell::EffectEnergize(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectInebriate(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectStuck(), Spell::EffectSummonType(), Spell::EffectTaunt(), Spell::EffectTeleportUnits(), Spell::EffectTitanGrip(), Spell::EffectTriggerMissileSpell(), Spell::EffectTriggerRitualOfSummoning(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::EmpowerCultist(), boss_the_lich_king::boss_the_lich_kingAI::EnterEvadeMode(), boss_zuljin::boss_zuljinAI::EnterPhase(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundEY::EventTeamCapturedPoint(), BattleExperienceEvent::Execute(), OrcDeathEvent::Execute(), CastArmageddon::Execute(), UtherBatteredHiltEvent::Execute(), ShockVortexExplodeEvent::Execute(), ResetEncounterEvent::Execute(), FrostBombExplosion::Execute(), IceTombSummonEvent::Execute(), VileSpiritActivateEvent::Execute(), LichKingMovieEvent::Execute(), DelayedCastEvent::Execute(), DelayedCastMincharEvent::Execute(), ChargeRifts::Execute(), CosmicSmashDamageEvent::Execute(), CastRunesEvent::Execute(), BoomEvent::Execute(), SACActivateEvent::Execute(), VerasEnvenom::Execute(), CastQuill::Execute(), lapseTeleport::Execute(), boss_salramm::boss_salrammAI::ExplodeGhoul(), spell_festergut_blighted_spores_aura::ExtraEffect(), spell_rotface_mutated_infection_aura::ExtraRemoveEffect(), npc_dark_iron_attack_generator::FinishAttackDueToWin(), npc_azure_saboteur::npc_azure_saboteurAI::FinishPointReached(), boss_janalai::boss_janalaiAI::FireWall(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::GoSiphon(), go_soulwell::go_soulwellAI::GossipHello(), spell_cataclysm_breath::HandleAfterCast(), spell_dk_chains_of_ice::HandleAfterCast(), spell_mage_arcane_blast::HandleAfterCast(), spell_q13086_last_line_of_defence::HandleAfterCast(), spell_infected_worgen_bite_aura::HandleAfterEffectApply(), spell_dk_blood_boil::HandleAfterHit(), spell_dk_scourge_strike::HandleAfterHit(), spell_rog_deadly_poison::HandleAfterHit(), spell_warlords_rage::HandleAfterRemove(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_felmyst_fog_of_corruption_charm_aura::HandleApply(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleApply(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), spell_dru_enrage::HandleApply(), spell_rog_killing_spree_aura::HandleApply(), spell_warr_vigilance::HandleApply(), spell_azjol_nerub_pound::HandleApplyAura(), BattlegroundIC::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_dk_death_grip::HandleBaseDummy(), misc_commandscript::HandleBindSightCommand(), spell_rotface_unstable_ooze_explosion_init::HandleCast(), spell_commander_sarannis_summon_reinforcements::HandleCast(), cast_commandscript::HandleCastBackCommand(), cast_commandscript::HandleCastCommand(), cast_commandscript::HandleCastDestCommand(), cast_commandscript::HandleCastDistCommand(), cast_commandscript::HandleCastSelfCommand(), cast_commandscript::HandleCastTargetCommad(), spell_gen_mounted_charge::HandleChargeEffect(), spell_dk_corpse_explosion::HandleCorpseExplosion(), OutdoorPvPSI::HandleCustomSpell(), WorldSession::HandleDuelCancelledOpcode(), spell_icc_shattered_bones::HandleDummy(), spell_corrupted_totems::HandleDummy(), spell_moroes_vanish::HandleDummy(), spell_karazhan_blink::HandleDummy(), spell_ooze_zap::HandleDummy(), spell_saviana_conflagration_init::HandleDummy(), spell_igb_burning_pitch_selector::HandleDummy(), spell_igb_burning_pitch::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_anti_air_rocket_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_illidan_found_target::HandleDummy(), spell_leotheras_chaos_blast::HandleDummy(), spell_morogrim_tidewalker_watery_grave::HandleDummy(), spell_q10935_the_exorcism_of_colonel_jules::HandleDummy(), spell_gen_focused_bursts::HandleDummy(), spell_shadowblink::HandleDummy(), spell_spawn_drakonid::HandleDummy(), spell_send_mug_target_picker::HandleDummy(), spell_hallows_end_candy::HandleDummy(), spell_hallows_end_bucket_lands::HandleDummy(), spell_midsummer_torch_catch::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_mana_burn_area::HandleDummy(), spell_voljin_war_drums::HandleDummy(), spell_voodoo::HandleDummy(), spell_sartharion_lava_strike::HandleDummy(), spell_halion_meteor_strike_targeting::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_drakkari_colossus_emerge::HandleDummy(), spell_drakkari_colossus_surge::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_voa_flaming_cinder::spell_voa_flaming_cinder_SpellScript::HandleDummy(), spell_q12096_q12092_dummy::HandleDummy(), spell_vehicle_warhead_fuse::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_najentus_needle_spine::HandleDummy(), spell_ice_spear_target_picker::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), spell_gen_cannibalize::HandleDummy(), spell_gen_gadgetzan_transporter_backfire::HandleDummy(), spell_gen_gnomish_transporter::HandleDummy(), spell_hun_masters_call::HandleDummy(), spell_hun_pet_carrion_feeder::HandleDummy(), spell_item_gnomish_universal_remote::HandleDummy(), spell_item_gnomish_shrink_ray::HandleDummy(), spell_item_trigger_spell::HandleDummy(), spell_item_deviate_fish::HandleDummy(), spell_item_flask_of_the_north::HandleDummy(), spell_item_make_a_wish::HandleDummy(), spell_item_mingos_fortune_generator::HandleDummy(), spell_item_net_o_matic::HandleDummy(), spell_item_noggenfogger_elixir::HandleDummy(), spell_item_savory_deviate_delight::HandleDummy(), spell_item_six_demon_bag::HandleDummy(), spell_item_underbelly_elixir::HandleDummy(), spell_item_vanquished_clutches::HandleDummy(), spell_item_purify_helboar_meat::HandleDummy(), spell_item_reindeer_transformation::HandleDummy(), spell_item_nigh_invulnerability::HandleDummy(), spell_item_poultryizer::HandleDummy(), spell_item_socrethars_stone::HandleDummy(), spell_item_demon_broiled_surprise::HandleDummy(), spell_item_complete_raptor_capture::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), spell_item_nitro_boots::HandleDummy(), spell_item_teach_language::HandleDummy(), spell_item_rocket_boots::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_item_greatmothers_soulcatcher::HandleDummy(), spell_mage_summon_water_elemental::HandleDummy(), spell_pal_blessing_of_faith::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pal_judgement_of_command::HandleDummy(), spell_pri_penance::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q5206_test_fetid_skull::HandleDummy(), spell_q11396_11399_scourging_crystal_controller::HandleDummy(), spell_q11587_arcane_prisoner_rescue::HandleDummy(), spell_q11730_ultrasonic_screwdriver::HandleDummy(), spell_q12634_despawn_fruit_tosser::HandleDummy(), spell_q12683_take_sputum_sample::HandleDummy(), spell_q12937_relief_for_the_fallen::HandleDummy(), spell_q9452_cast_net::HandleDummy(), spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy::HandleDummy(), spell_q12308_escape_from_silverbrook::HandleDummy(), spell_q12641_death_comes_from_on_high::HandleDummy(), spell_rog_shiv::HandleDummy(), spell_sha_fire_nova::HandleDummy(), spell_warl_ritual_of_doom_effect::HandleDummy(), spell_warl_soulshatter::HandleDummy(), spell_warr_charge::HandleDummy(), spell_magtheridon_shadow_grasp::HandleDummyApply(), HandleDummyAuraProc(), spell_yogg_saron_destabilization_matrix::HandleDummyEffect(), spell_yogg_saron_insane_periodic_trigger::HandleDummyEffect(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_talon_king_ikiss_blink::HandleDummyHitTarget(), spell_shadowfang_keep_forsaken_skills::spell_shadowfang_keep_forsaken_skills_AuraScript::HandleDummyTick(), spell_item_rocket_chicken::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_shadowfang_keep_haunting_spirits::spell_shadowfang_keep_haunting_spirits_AuraScript::HandleDummyTick(), spell_blood_council_shadow_prison_aura::HandleDummyTick(), spell_mark_of_nature::HandleEffect(), spell_target_fissures::HandleEffect(), spell_rog_vanish::HandleEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_midsummer_ribbon_pole::HandleEffectApply(), spell_tharon_ja_dummy_aura::HandleEffectApply(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_leotheras_insidious_whisper_aura::HandleEffectApply(), spell_serpentshrine_cavern_coilfang_water::HandleEffectApply(), spell_q12851_going_bearback::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_gen_whisper_gulch_yogg_saron_whisper::HandleEffectPeriodic(), spell_rog_killing_spree_aura::HandleEffectPeriodic(), spell_sha_earthbind_totem::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_warr_retaliation::HandleEffectProc(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_trigger_aura::HandleEffectRemove(), spell_teron_gorefiend_shadow_of_death::HandleEffectRemove(), spell_black_temple_skeleton_shot_aura::HandleEffectRemove(), spell_hydross_cleansing_field_command::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite_trigger_aura::HandleEffectRemove(), spell_q10930_big_bone_worm_aura::HandleEffectRemove(), spell_q10929_fumping_aura::HandleEffectRemove(), spell_flamewreath::HandleFinish(), spell_midsummer_fling_torch::HandleFinish(), spell_midsummer_juggling_torch::HandleFinish(), spell_wintergrasp_rp_gg::HandleFinish(), spell_dreamwalker_summoner::HandleForceCast(), spell_dreamwalker_summon_suppresser_effect::HandleForceCast(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), OPvPCapturePointZM_GraveYard::HandleGossipOption(), spell_item_crazy_alchemists_potion::HandleHeal(), spell_magtheridon_quake::HandleHit(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundIC::HandleKillUnit(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_ticking_time_bomb_aura::HandleOnEffectRemove(), spell_delusions_of_jindo::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), spell_mark_of_frost_freeze::HandleOnHit(), spell_mutate_explode_bug::HandleOnHit(), spell_explode_trigger::HandleOnHit(), spell_blade_dance_targeting::HandleOnHit(), HandleOverrideClassScriptAuraProc(), aura_class_call_wild_magic::HandlePeriodic(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_halion_meteor_strike_spread_aura::HandlePeriodic(), spell_sladran_grip_of_sladran_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_close_rift_aura::HandlePeriodic(), spell_serpentshrine_cavern_coilfang_water::HandlePeriodic(), spell_rancid_spore_cloud::HandlePeriodic(), spell_kaelthas_remote_toy::HandlePeriodic(), spell_q10923_evil_draws_near_periodic_aura::HandlePeriodic(), spell_sha_totemic_mastery::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_kiljaeden_shadow_spike_aura::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), spell_halion_twilight_cutter_periodic_aura::HandlePeriodic(), spell_oculus_ride_ruby_emerald_amber_drake_que_aura::HandlePeriodic(), spell_hun_sniper_training::HandlePeriodic(), spell_shadow_bolt_whirl::HandlePeriodic(), spell_voa_overcharge::spell_voa_overcharge_AuraScript::HandlePeriodicDummy(), AuraEffect::HandlePeriodicDummyAuraTick(), spell_magtheridon_shadow_grasp::HandlePeriodicRemove(), spell_igb_periodic_trigger_with_power_cost_aura::HandlePeriodicTick(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), spell_bronjahm_soulstorm_channel_ooc_aura::HandlePeriodicTick(), spell_bronjahm_soulstorm_visual_aura::HandlePeriodicTick(), spell_item_direbrew_remote_aura::HandlePeriodicTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceMoveByAI(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), BattlegroundIC::HandlePlayerResurrect(), misc_commandscript::HandlePossessCommand(), spell_blood_queen_vampiric_bite::HandlePresence(), spell_mark_of_malice::HandleProc(), spell_item_lil_phylactery::HandleProc(), spell_item_fate_rune_of_unsurpassed_vigor::HandleProc(), spell_mage_burning_determination::HandleProc(), spell_rog_tricks_of_the_trade::HandleProc(), spell_gyth_chromatic_protection::HandleProc(), spell_ahune_spanky_hands::HandleProc(), spell_item_trauma::HandleProc(), spell_item_shadows_fate::HandleProc(), spell_utgarde_pinnacle_beast_mark::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_hun_improved_mend_pet::HandleProc(), spell_hun_misdirection::HandleProc(), spell_item_aegis_of_preservation::HandleProc(), spell_item_desperate_defense::HandleProc(), spell_mage_focus_magic::HandleProc(), spell_pal_blessing_of_sanctuary::HandleProc(), spell_pri_item_greater_heal_refund::HandleProc(), spell_pri_mana_leech::HandleProc(), spell_sha_item_lightning_shield_trigger::HandleProc(), spell_warr_vigilance::HandleProc(), spell_karazhan_temptation::HandleProc(), spell_dk_blood_caked_blade::HandleProc(), spell_dk_dancing_rune_weapon::HandleProc(), spell_gen_adaptive_warding::HandleProc(), spell_gen_moss_covered_feet::HandleProc(), spell_item_unsated_craving::HandleProc(), spell_item_shadowmourne::HandleProc(), spell_sha_item_lightning_shield::HandleProc(), spell_warl_glyph_of_shadowflame::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), spell_hun_lock_and_load::HandleProcs(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellAuraProc(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), AuraEffect::HandleRaidProcFromChargeAuraProc(), spell_dk_raise_dead::HandleRaiseDead(), spell_vael_burning_adrenaline::HandleRemove(), spell_kiljaeden_darkness_aura::HandleRemove(), spell_entropius_void_zone_visual_aura::HandleRemove(), spell_igb_rocket_pack_aura::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_gen_mine_sweeper::HandleSchoolDMG(), spell_warl_shadowflame::HandleSchoolDMG(), spell_gen_bandage::HandleScript(), spell_pal_lay_on_hands::HandleScript(), spell_kormok_summon_bone_mages::HandleScript(), spell_kormok_summon_bone_minions::HandleScript(), spell_energize_aoe::HandleScript(), spell_saviana_conflagration_throwback::HandleScript(), spell_taldaram_glittering_sparks::HandleScript(), spell_blood_queen_bloodbolt::HandleScript(), spell_blood_queen_presence_of_the_darkfallen::HandleScript(), spell_igb_rocket_artillery::HandleScript(), spell_putricide_unstable_experiment::HandleScript(), spell_sindragosa_icy_grip::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_summon_spirit_bomb::HandleScript(), spell_dreamwalker_summon_portal::HandleScript(), spell_dreamwalker_twisted_nightmares::HandleScript(), spell_archavon_rock_shards::spell_archavon_rock_shards_SpellScript::HandleScript(), spell_wintergrasp_portal::HandleScript(), spell_gen_create_lance::HandleScript(), spell_item_defibrillate::HandleScript(), spell_item_scroll_of_recall::HandleScript(), spell_shazzrah_gate_dummy::HandleScript(), spell_apothecary_lingering_fumes::HandleScript(), spell_apothecary_validate_area::HandleScript(), spell_apothecary_throw_cologne::HandleScript(), spell_apothecary_throw_perfume::HandleScript(), spell_hallows_end_trick::HandleScript(), spell_hallows_end_put_costume::HandleScript(), spell_hallows_end_trick_or_treat::HandleScript(), spell_winter_veil_mistletoe::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_moam_summon_mana_fiends::HandleScript(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), spell_mistress_kiss_area::spell_mistress_kiss_area_SpellScript::HandleScript(), spell_novos_summon_minions::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_choking_gas_bomb::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_the_lich_king_cast_back_to_caster::HandleScript(), spell_frost_giant_death_plague::HandleScript(), spell_yogg_saron_target_selectors::HandleScript(), spell_the_black_stalker_levitate::HandleScript(), spell_the_black_stalker_levitation_pulse::HandleScript(), spell_the_black_stalker_someone_grab_me::HandleScript(), spell_the_black_stalker_magnetic_pull::HandleScript(), spell_the_flag_of_ownership::HandleScript(), spell_gen_elune_candle::HandleScript(), spell_gen_teleporting::HandleScript(), spell_gen_dalaran_disguise::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_item_dimensional_ripper_area52::HandleScript(), spell_item_eggnog::HandleScript(), spell_q12735_song_of_cleansing::HandleScript(), spell_q13011_bear_flank_master::HandleScript(), spell_q12619_emblazon_runeblade_effect::HandleScript(), spell_q12919_gymers_grab::HandleScript(), spell_q12919_gymers_throw::HandleScript(), spell_q12641_death_comes_from_on_high_summon_ghouls::spell_q12641_death_comes_from_on_high_summon_ghouls_SpellScript::HandleScriptEffect(), spell_kalecgos_spectral_realm_dummy::HandleScriptEffect(), spell_entropius_negative_energy::HandleScriptEffect(), spell_marrowgar_coldflame_bonestorm::HandleScriptEffect(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_black_temple_bloodbolt::HandleScriptEffect(), spell_lady_vashj_summon_sporebat::HandleScriptEffect(), spell_kaelthas_summon_weapons::HandleScriptEffect(), spell_kaelthas_gravity_lapse::HandleScriptEffect(), spell_kaelthas_nether_beam::HandleScriptEffect(), spell_gen_clone::HandleScriptEffect(), spell_gen_clone_weapon::HandleScriptEffect(), spell_gen_break_shield::HandleScriptEffect(), spell_gen_mounted_charge::HandleScriptEffect(), spell_gen_throw_shield::HandleScriptEffect(), spell_item_sleepy_willy::HandleScriptEffect(), spell_item_lil_xt::HandleScriptEffect(), spell_q12698_the_gift_that_keeps_on_giving::spell_q12698_the_gift_that_keeps_on_giving_SpellScript::HandleScriptEffect(), spell_death_knight_initiate_visual::HandleScriptEffect(), spell_q12779_an_end_to_all_things::HandleScriptEffect(), spell_brewfest_toss_mug::HandleScriptEffect(), spell_direbrew_summon_mole_machine_target_picker::HandleScriptEffect(), spell_request_second_mug::HandleScriptEffect(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), spell_dtk_summon_random_drakkari::HandleScriptEffect(), spell_marrowgar_coldflame::HandleScriptEffect(), spell_arcane_chains_character_force_cast::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), spell_black_temple_summon_shadowfiends::HandleScriptEffect(), spell_ice_bombardment_dest_picker::HandleScriptEffect(), spell_kaelthas_remove_enchanted_weapons::HandleScriptEffect(), spell_kaelthas_kael_explodes::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_hun_masters_call::HandleScriptEffect(), spell_item_mirrens_drinking_hat::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), spell_q1846_bending_shinbone::HandleScriptEffect(), spell_q14112_14145_chum_the_water::HandleScriptEffect(), WorldSession::HandleSelfResOpcode(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), HandleSpellClick(), spell_marrowgar_bone_spike_graveyard::HandleSpikes(), AuraEffect::HandleSpiritOfRedemption(), spell_gen_paralytic_poison::HandleStun(), spell_putricide_mutated_transformation::HandleSummon(), spell_item_draenic_pale_ale::HandleSummon(), WorldSession::HandleTalentWipeConfirmOpcode(), spell_mother_shahraz_fatal_attraction::HandleTeleportUnits(), spell_warl_drain_soul::HandleTick(), WorldSession::HandleTrainerBuySpellOpcode(), spell_trigger_spell_from_caster::HandleTrigger(), spell_magic_eater_food::HandleTriggerSpell(), spell_winter_veil_racer_rocket_slam::HandleTriggerSpell(), spell_pal_righteous_defense::HandleTriggerSpellHit(), boss_onyxia::HandleWhelpSpam(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), boss_ichoron::boss_ichoronAI::IchoronDoCastToAllHostilePlayers(), spell_q10769_dissension_amongst_the_ranks_aura::if(), CharmInfo::InitCharmCreateSpells(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InitFight(), boss_urok_doomhowl::boss_urok_doomhowlAI::InitializeAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::InitializeAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::InitializeAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::InitializeAI(), boss_gal_darah::boss_gal_darahAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), CharmInfo::InitPossessCreateSpells(), Guardian::InitStatsForLevel(), Totem::InitSummon(), boss_faction_championsAI::IsCCed(), npc_living_inferno::npc_living_infernoAI::IsSummonedBy(), TriggerAI::IsSummonedBy(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_bone_spike::npc_bone_spikeAI::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_pet_gen_fetch_ball::IsSummonedBy(), npc_kiljaeden_controller::npc_kiljaeden_controllerAI::JustDied(), npc_hallows_end_soh::JustDied(), boss_rajaxx::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), npc_swarm_scarab::npc_swarm_scarabAI::JustDied(), npc_phantom_hallucination::npc_phantom_hallucinationAI::JustDied(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::JustDied(), boss_steelbreaker::boss_steelbreakerAI::JustDied(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_freya_summons::boss_freya_summonsAI::JustDied(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::JustDied(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::JustDied(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::JustDied(), boss_dalronn_the_controller::boss_dalronn_the_controllerAI::JustDied(), npc_ichor_globule::npc_ichor_globuleAI::JustDied(), boss_fathomguard_sharkkis::JustDied(), boss_fathomguard_tidalvess::JustDied(), boss_fathomguard_caribdis::JustDied(), CombatAI::JustDied(), npc_high_inquisitor_valroth::npc_high_inquisitor_valrothAI::JustDied(), boss_brutallus::boss_brutallusAI::JustDied(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_tharon_ja::boss_tharon_jaAI::JustDied(), boss_sapphiron::boss_sapphironAI::JustDied(), boss_anomalus::boss_anomalusAI::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_shade_of_akama::JustDied(), CasterAI::JustEngagedWith(), boss_servant_quarters::JustEngagedWith(), npc_mograine::npc_mograineAI::JustEngagedWith(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::JustEngagedWith(), npc_hallows_end_soh::JustEngagedWith(), boss_eadric::boss_eadricAI::JustEngagedWith(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustEngagedWith(), boss_twin_valkyrAI::JustEngagedWith(), boss_garfrost::boss_garfrostAI::JustEngagedWith(), npc_stinky_icc::npc_stinky_iccAI::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), npc_rimefang::npc_rimefangAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_freya_summons::boss_freya_summonsAI::JustEngagedWith(), boss_vezax::boss_vezaxAI::JustEngagedWith(), boss_hodir::boss_hodirAI::JustEngagedWith(), boss_thorim::boss_thorimAI::JustEngagedWith(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustEngagedWith(), boss_koralon::boss_koralonAI::JustEngagedWith(), boss_toravon::boss_toravonAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustEngagedWith(), boss_moragg::boss_moraggAI::JustEngagedWith(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::JustEngagedWith(), boss_watchkeeper_gargolmar::JustEngagedWith(), boss_gatewatcher_gyrokill::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), CombatAI::JustEngagedWith(), boss_ellris_duskhallow::JustEngagedWith(), boss_warlord_salaris::JustEngagedWith(), boss_garaxxas::JustEngagedWith(), boss_muru::boss_muruAI::JustEngagedWith(), boss_yauj::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_moorabi::boss_moorabiAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), boss_sapphiron::boss_sapphironAI::JustEngagedWith(), boss_keristrasza::boss_keristraszaAI::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_fathomlord_karathress::JustEngagedWith(), boss_fathomguard_sharkkis::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustReachedHome(), boss_bronjahm::boss_bronjahmAI::JustReachedHome(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustReachedHome(), boss_gal_darah::boss_gal_darahAI::JustReachedHome(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::JustReachedHome(), boss_freya::boss_freyaAI::JustSummoned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_skeram::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_ragnaros::boss_ragnarosAI::JustSummoned(), boss_vexallus::JustSummoned(), boss_kiljaeden::boss_kiljaedenAI::JustSummoned(), npc_kalecgos_kj::npc_kalecgos_kjAI::JustSummoned(), boss_jindo::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_taldaram::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_gal_darah::boss_gal_darahAI::JustSummoned(), boss_prince_valanar_icc::boss_prince_valanarAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::JustSummoned(), boss_malygos::boss_malygosAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_svala::boss_svalaAI::JustSummoned(), boss_shirrak_the_dead_watcher::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), boss_grandmaster_vorpil::JustSummoned(), boss_gurtogg_bloodboil::JustSummoned(), boss_veras_darkshadow::JustSummoned(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::JustSummoned(), boss_supremus::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::JustSummoned(), boss_ayamiss::JustSummoned(), Kill(), boss_azuregos::boss_azuregosAI::KilledUnit(), boss_anubrekhan::boss_anubrekhanAI::KilledUnit(), boss_doomwalker::KilledUnit(), npc_dark_iron_guzzler::KilledUnit(), boss_steelbreaker::boss_steelbreakerAI::KilledUnit(), emerald_dragonAI::KilledUnit(), boss_emeriss::boss_emerissAI::KilledUnit(), boss_felblood_kaelthas::LapseAction(), spell_mandokir_charge::LaunchHit(), Player::learnQuestRewardedSpells(), spell_taldaram_summon_flame_ball::Load(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), npc_brewfest_keg_thrower::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_love_in_air_snivel::MoveInLineOfSight(), boss_temporus::MoveInLineOfSight(), npc_medivh_bm::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_spirit_shade::npc_spirit_shadeAI::MovementInform(), boss_selin_fireheart::MovementInform(), npc_unworthy_initiate::npc_unworthy_initiateAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_eck::boss_eckAI::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), boss_malygos::boss_malygosAI::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::MovementInform(), boss_headless_horseman::MovementInform(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::MovementInform(), npc_ashtongue_sorcerer::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), boss_kagani_nightstrike::MovementInform(), npc_dark_iron_guzzler::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_assembly_lightning::npc_assembly_lightningAI::MovementInform(), boss_ymiron::boss_ymironAI::MovementInform(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), BattlegroundAB::NodeOccupied(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::npc_algalon_worm_holeAI(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_frost_tomb::npc_frost_tombAI::npc_frost_tombAI(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_hol_monument::npc_hol_monumentAI::npc_hol_monumentAI(), npc_midsummer_torch_target::npc_midsummer_torch_target(), npc_power_spark::npc_power_sparkAI::npc_power_sparkAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::npc_ulduar_iron_constructAI(), npc_ulduar_toasty_fire::npc_ulduar_toasty_fireAI::npc_ulduar_toasty_fireAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), spell_shadowfang_keep_forsaken_skills::spell_shadowfang_keep_forsaken_skills_AuraScript::OnApply(), spell_direbrew_disarm::OnApply(), spell_love_is_in_the_air_romantic_picnic::OnApply(), spell_halion_combustion_consumption_aura::OnApply(), spell_load_into_catapult_aura::OnApply(), spell_gen_damage_reduction_aura::OnApply(), spell_gruul_ground_slam_trigger::OnApply(), spell_hun_ascpect_of_the_viper::OnApply(), spell_hun_viper_attack_speed::OnApply(), spell_item_with_mount_speed::OnApply(), spell_blood_queen_vampiric_bite::OnCast(), npc_chesspiece::OnCharmed(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_item_linken_boomerang::OnEffectLaunchTargetDisarm(), spell_item_linken_boomerang::OnEffectLaunchTargetStun(), npc_essence_of_twin::OnGossipHello(), npc_alchemist_adrianna::OnGossipHello(), go_inconspicuous_mine_car::OnGossipHello(), go_manticron_cube::OnGossipHello(), go_noblegarden_colored_egg::OnGossipHello(), go_seer_of_zebhalak::OnGossipHello(), go_jump_a_tron::OnGossipHello(), go_orb_of_domination::OnGossipHello(), go_scourge_enclosure::OnGossipHello(), go_strange_pool::OnGossipHello(), go_simon_cluster::OnGossipHello(), go_tablet_of_the_seven::OnGossipHello(), go_arcane_prison::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), npc_steward_of_time::OnGossipSelect(), npc_iruk::OnGossipSelect(), npc_zephyr::OnGossipSelect(), npc_taxi::OnGossipSelect(), npc_locksmith::OnGossipSelect(), npc_engineering_tele_trinket::OnGossipSelect(), npc_sayge::OnGossipSelect(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_lokhtos_darkbargainer::OnGossipSelect(), boss_gloomrel::OnGossipSelect(), npc_death_knight_initiate::OnGossipSelect(), npc_parqual_fintallas::OnGossipSelect(), npcs_riverbreeze_and_silversky::OnGossipSelect(), npc_braug_dimspirit::OnGossipSelect(), npc_avatar_of_freya::OnGossipSelect(), npc_adventurous_dwarf::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), npc_wormhole::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), go_amberpine_outhouse::OnGossipSelect(), go_fel_crystalforge::OnGossipSelect(), go_bashir_crystalforge::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), Player::OnGossipSelect(), lfg::LFGPlayerScript::OnMapChanged(), spell_apothecary_perfume_spill::OnPeriodic(), spell_apothecary_cologne_spill::OnPeriodic(), spell_muru_summon_blood_elves_periodic_aura::OnPeriodic(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_anubisath_mortal_strike::OnPeriodic(), spell_the_lich_king_soul_reaper_aura::OnPeriodic(), spell_yogg_saron_brain_link_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_illidan_tear_of_azzinoth_summon_channel_aura::OnPeriodic(), spell_illidan_demon_transform1_aura::OnPeriodic(), spell_illidan_cage_trap_stun_aura::OnPeriodic(), spell_black_temple_dementia_aura::OnPeriodic(), spell_npc22275_crystal_prison_aura::OnPeriodic(), spell_item_eye_of_grillok_aura::OnPeriodic(), spell_muru_darkness_aura::OnPeriodic(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_the_lich_king_vile_spirits_aura::OnPeriodic(), spell_web_wrap_damage::OnPeriodic(), spell_assembly_rune_of_summoning_aura::OnPeriodic(), spell_thorim_lightning_pillar_P2_aura::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), spell_karathress_power_of_tidalvess::OnPeriodic(), spell_karathress_power_of_caribdis::OnPeriodic(), spell_leotheras_demon_link::OnPeriodic(), spell_lurker_below_spout::OnPeriodic(), spell_gen_periodic_knock_away::OnPeriodic(), spell_gen_turkey_marker::OnPeriodic(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnPlayerInWaterStateUpdate(), BattlefieldWG::OnPlayerJoinWar(), spell_gen_obsidian_armor::OnProc(), npc_steward_of_time::OnQuestAccept(), npc_mikhail::OnQuestAccept(), npc_rocknot::OnQuestReward(), npc_thrall_bfu::OnQuestReward(), spell_kalecgos_spectral_realm_aura::OnRemove(), spell_azgalor_doom_aura::OnRemove(), spell_boss_salramm_steal_flesh_aura::OnRemove(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_putricide_mutation_init_aura::OnRemove(), spell_the_lich_king_shadow_trap_visual_aura::OnRemove(), spell_the_lich_king_harvest_soul_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_ioc_repair_turret_aura::OnRemove(), spell_kaelthas_flame_strike::OnRemove(), spell_item_goblin_weather_machine_aura::OnRemove(), spell_warl_curse_of_doom::OnRemove(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), spell_item_shadowmourne_soul_fragment::OnStackChange(), at_hor_battered_hilt_throw::OnTrigger(), at_frozen_throne_teleport::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_stormwright_shelf::OnTrigger(), MidsummerPlayerScript::OnUpdateZone(), npc_wintergarde_gryphon::PassengerBoarded(), npc_four_car_garage::npc_four_car_garageAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), spell_quest_test_flight_charging::PerformKick(), spell_send_mug_control_aura::PeriodicTick(), spell_barreled_control_aura::PeriodicTick(), spell_dreamwalker_summon_suppresser_aura::PeriodicTick(), spell_summon_ice_spear_delayer::PeriodicTick(), spell_summoning_rhyme_aura::PeriodicTick(), spell_halion_twilight_phasing::Phase(), Battlefield::PlayerAskToLeave(), BattlegroundAV::PopulateNode(), spell_azjol_nerub_carrion_beetels::PrepareAuraScript(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11653_youre_not_so_big_now::PrepareSpellScript(), spell_q13369_fate_up_against_your_will::PrepareSpellScript(), SmartScript::ProcessAction(), ProcessCastaction(), Player::ProcessDelayedOperations(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::ProcessEvent(), ProcessTerrainStatusUpdate(), ProcessUnlearnAction(), BattlefieldWG::PromotePlayer(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), spell_gen_defend::RefreshVisualShields(), Vehicle::RemovePassenger(), spell_igb_below_zero::RemovePassengers(), boss_keristrasza::boss_keristraszaAI::RemovePrison(), Player::ReportedAfkBy(), GuardAI::Reset(), boss_brutallus::boss_brutallusAI::Reset(), boss_sacrolash::boss_sacrolashAI::Reset(), boss_alythess::boss_alythessAI::Reset(), npc_demonic_vapor::npc_demonic_vaporAI::Reset(), npc_demonic_vapor_trail::npc_demonic_vapor_trailAI::Reset(), boss_kalec::boss_kalecAI::Reset(), boss_sathrovarr::boss_sathrovarrAI::Reset(), npc_kiljaeden_controller::npc_kiljaeden_controllerAI::Reset(), npc_singularity::npc_singularityAI::Reset(), npc_batrider::Reset(), npc_dark_iron_guzzler::Reset(), boss_headless_horseman_pumpkin::Reset(), npc_taretha::npc_tarethaAI::Reset(), npc_medivh_bm::Reset(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_nerubian_burrower::npc_nerubian_burrowerAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_elemental::boss_drakkari_elementalAI::Reset(), npc_dark_nucleus::npc_dark_nucleusAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_anomalus::boss_anomalusAI::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_bjarngrim::boss_bjarngrimAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_freya_lifebinder::boss_freya_lifebinderAI::Reset(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::Reset(), boss_freya_nature_bomb::boss_freya_nature_bombAI::Reset(), boss_thorim_lightning_orb::boss_thorim_lightning_orbAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::Reset(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_yoggsaron_voice::boss_yoggsaron_voiceAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_frozen_orb::npc_frozen_orbAI::Reset(), npc_frozen_orb_stalker::npc_frozen_orb_stalkerAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::Reset(), npc_storm_cloud::npc_storm_cloudAI::Reset(), npc_ashtongue_channeler::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), boss_wrath_scryer_soccothrates::Reset(), npc_training_dummy::npc_training_dummyAI::Reset(), BfGraveyard::Resurrect(), Resurrect(), Player::ResurrectPlayer(), Player::RewardQuest(), boss_bjarngrim::boss_bjarngrimAI::RollStance(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), Map::ScriptsProcess(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_sayge::SendAction(), go_skull_pile::SendActionMenu(), npc_xt002_heart::npc_xt002_heartAI::SendEnergyToCorner(), Player::SendInitialPacketsAfterAddToMap(), Player::SendQuestUpdate(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), npc_eastvale_peasent::SetData(), SetModelVisible(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), npc_stable_master::npc_stable_masterAI::sGossipSelect(), npc_brewfest_keg_reciver::sGossipSelect(), npc_cairne_bloodhoof::npc_cairne_bloodhoofAI::sGossipSelect(), npc_chesspiece::sGossipSelect(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::sGossipSelect(), npc_zafod_boombox::npc_zafod_boomboxAI::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_zuljin::boss_zuljinAI::SpawnAdds(), boss_skadi_grauf::boss_skadi_graufAI::SpawnFlameTriggers(), boss_malchezaar::SpawnInfernal(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), boss_eadric::boss_eadricAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_ichor_globule::npc_ichor_globuleAI::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_franklin::npc_franklinAI::SpellHit(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_headless_horseman::SpellHit(), boss_thorim_pillar::boss_thorim_pillarAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_living_constellation::npc_living_constellationAI::SpellHit(), boss_ignis::boss_ignisAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), npc_storm_cloud::npc_storm_cloudAI::SpellHit(), npc_soh_fire_trigger::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_midsummer_torch_target::SpellHit(), boss_magus_telestra::boss_magus_telestraAI::SpellHit(), boss_thorim::boss_thorimAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_bronjahm::boss_bronjahmAI::SpellHitTarget(), npc_demonic_vapor_trail::npc_demonic_vapor_trailAI::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_rotface::boss_rotfaceAI::SpellHitTarget(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), boss_hodir::boss_hodirAI::SpellHitTarget(), npc_ulduar_rocket_strike_trigger::npc_ulduar_rocket_strike_triggerAI::SpellHitTarget(), npc_q24545_lich_king::npc_q24545_lich_kingAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), boss_epoch::boss_epochAI::SpellHitTarget(), boss_sapphiron::boss_sapphironAI::SpellHitTarget(), boss_skadi_grauf::boss_skadi_graufAI::SpellHitTarget(), boss_shirrak_the_dead_watcher::SpellHitTarget(), npc_pet_gen_soul_trader_beacon::SpellHitTarget(), Battleground::SpiritOfCompetitionEvent(), boss_ionar::boss_ionarAI::Split(), boss_heigan::boss_heiganAI::StartFightPhase(), npc_finklestein::npc_finklesteinAI::StartNextTask(), Player::StoreItem(), spell_dk_ghoul_explode::Suicide(), boss_anzu::SummonBroods(), boss_anubrekhan::boss_anubrekhanAI::SummonedCreatureDies(), boss_cthun::SummonedCreatureDies(), boss_vexallus::SummonedCreatureDies(), boss_paletress::boss_paletressAI::SummonMemory(), go_wind_stone::go_wind_stoneAI::SummonNPC(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), spell_igb_check_for_players::TeleportPlayer(), BattlegroundSA::TeleportToEntrancePosition(), spell_midsummer_fling_torch::ThrowNextTorch(), TriggerBurningPitch(), npc_orb_carrier::npc_orb_carrierAI::TriggerCutter(), spell_koralon_meteor_fists::spell_koralon_meteor_fists_AuraScript::TriggerFists(), spell_flame_warder_meteor_fists::spell_flame_warder_meteor_fists_AuraScript::TriggerFists(), spell_gen_holiday_buff_food::TriggerFoodBuff(), spell_karazhan_brittle_bones_aura::Update(), spell_black_temple_curse_of_the_bleakheart_aura::Update(), spell_illidari_council_deadly_strike_aura::Update(), spell_mother_shahraz_random_periodic_aura::Update(), spell_mother_shahraz_beam_periodic_aura::Update(), spell_mother_shahraz_saber_lash_aura::Update(), spell_black_temple_charge_rage_aura::Update(), Pet::Update(), GameObject::Update(), TotemAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_image_of_medivh::npc_image_of_medivhAI::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), boss_priestess_delrissa::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), boss_kagani_nightstrike::UpdateAI(), boss_ellris_duskhallow::UpdateAI(), boss_eramas_brightblaze::UpdateAI(), boss_yazzai::UpdateAI(), boss_warlord_salaris::UpdateAI(), boss_garaxxas::UpdateAI(), boss_apoko::UpdateAI(), boss_zelfan::UpdateAI(), boss_selin_fireheart::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_brutallus::boss_brutallusAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_sacrolash::boss_sacrolashAI::UpdateAI(), boss_alythess::boss_alythessAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), npc_demonic_vapor_trail::npc_demonic_vapor_trailAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kalec::boss_kalecAI::UpdateAI(), boss_sathrovarr::boss_sathrovarrAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_kalecgos_kj::npc_kalecgos_kjAI::UpdateAI(), boss_muru::boss_muruAI::UpdateAI(), boss_entropius::boss_entropiusAI::UpdateAI(), npc_singularity::npc_singularityAI::UpdateAI(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_brewfest_super_brew_trigger::UpdateAI(), npc_hallows_end_train_fire::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_headless_horseman_head::UpdateAI(), boss_headless_horseman_pumpkin::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), npc_time_rift::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_tharnarian::npc_tharnarianAI::UpdateAI(), boss_taldaram::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), npc_halion_controller::npc_halion_controllerAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_swarm_scarab::npc_swarm_scarabAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_druid::npc_toc_druidAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_paladin::npc_toc_paladinAI::UpdateAI(), npc_toc_priest::npc_toc_priestAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), npc_pos_icicle_trigger::npc_pos_icicle_triggerAI::UpdateAI(), npc_pos_collapsing_icicle::npc_pos_collapsing_icicleAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_anubrekhan::boss_anubrekhanAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::UpdateAI(), boss_heigan::boss_heiganAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_naxxramas_misc::boss_naxxramas_miscAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), npc_alexstrasza::npc_alexstraszaAI::UpdateAI(), boss_anomalus::boss_anomalusAI::UpdateAI(), boss_commander_stoutbeard::boss_commander_stoutbeardAI::UpdateAI(), boss_keristrasza::boss_keristraszaAI::UpdateAI(), boss_magus_telestra::boss_magus_telestraAI::UpdateAI(), boss_ormorok::boss_ormorokAI::UpdateAI(), npc_crystal_spike::npc_crystal_spikeAI::UpdateAI(), npc_crystalline_frayer::npc_crystalline_frayerAI::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_freya_nature_bomb::boss_freya_nature_bombAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_saronite_animus::npc_ulduar_saronite_animusAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_icicle::npc_ulduar_icicleAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_proximity_mine::npc_ulduar_proximity_mineAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), boss_keleseth::boss_kelesethAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::UpdateAI(), boss_dalronn_the_controller::boss_dalronn_the_controllerAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_thassarian::npc_thassarianAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_jungle_punch_target::npc_jungle_punch_targetAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_queue::npc_wg_queueAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_invis_infernal_caster::npc_invis_infernal_casterAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), trigger_periodic::trigger_periodicAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_maexxna_webwrap::boss_maexxna_webwrapAI::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_q24545_vegard_dummy::npc_q24545_vegard_dummyAI::UpdateAI(), Player::UpdateAreaDependentAuras(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdatePhase(), Player::UpdateZoneDependentAuras(), GameObject::Use(), Player::VehicleSpellInitialize(), boss_bjarngrim::boss_bjarngrimAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), and npc_engineer_helice::npc_engineer_heliceAI::WaypointReached().

◆ CastSpell() [4/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1213{
1214 return CastSpell(victim, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1215}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [5/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1218{
1219 SpellCastTargets targets;
1220 targets.SetUnitTarget(victim);
1221 return CastSpell(targets, spellInfo, nullptr, triggerFlags, castItem, triggeredByAura, originalCaster);
1222}

References CastSpell(), and SpellCastTargets::SetUnitTarget().

◆ CastSpell() [6/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1196{
1197 return CastSpell(victim, spellId, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1198}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [7/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1201{
1202 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1203 if (!spellInfo)
1204 {
1205 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1207 }
1208
1209 return CastSpell(victim, spellInfo, triggerFlags, castItem, triggeredByAura, originalCaster);
1210}

References CastSpell(), Object::GetGUID(), LOG_ERROR, SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastStop()

◆ ChangeSeat()

void Unit::ChangeSeat ( int8  seatId,
bool  next = true 
)
19704{
19705 if (!m_vehicle)
19706 return;
19707
19708 if (seatId < 0)
19709 {
19710 seatId = m_vehicle->GetNextEmptySeat(GetTransSeat(), next);
19711 if (seatId < 0)
19712 return;
19713 }
19714 else if (seatId == GetTransSeat() || !m_vehicle->HasEmptySeat(seatId))
19715 return;
19716
19718 if (!m_vehicle->AddPassenger(this, seatId))
19719 ABORT();
19720}
int8 GetNextEmptySeat(int8 seatId, bool next) const
Definition: Vehicle.cpp:245
bool HasEmptySeat(int8 seatId) const
Definition: Vehicle.cpp:219

References ABORT, Vehicle::AddPassenger(), Vehicle::GetNextEmptySeat(), WorldObject::GetTransSeat(), Vehicle::HasEmptySeat(), m_vehicle, and Vehicle::RemovePassenger().

Referenced by _EnterVehicle(), and WorldSession::HandleChangeSeatsOnControlledVehicle().

◆ CleanupBeforeRemoveFromMap()

void Unit::CleanupBeforeRemoveFromMap ( bool  finalCleanup)
15729{
15731 return;
15732
15733 // This needs to be before RemoveFromWorld to make GetCaster() return a valid pointer on aura removal
15735
15736 if (IsInWorld()) // not in world and not being removed atm
15738
15739 ASSERT(GetGUID());
15740
15741 // A unit may be in removelist and not in world, but it is still in grid
15742 // and may have some references during delete
15745
15746 if (finalCleanup)
15747 m_cleanupDone = true;
15748
15749 m_Events.KillAllEvents(false); // non-delatable (currently casted spells) will not deleted now but it will deleted at call in Map::RemoveAllObjectsInRemoveList
15750 CombatStop();
15755 GetMotionMaster()->Clear(false); // remove different non-standard movement generators.
15756}
void KillAllEvents(bool force)
Definition: EventProcessor.cpp:82
void deleteReferences(bool removeFromMap=false)
Definition: HostileRefMgr.cpp:125
void ClearAllThreat()
Definition: ThreatMgr.cpp:417
void CombatStop(bool includingCast=false)
Definition: Unit.cpp:10427
void RemoveAllGameObjects()
Definition: Unit.cpp:6263
void ClearComboPoints()
Definition: Unit.cpp:16851
void ClearComboPointHolders()
Definition: Unit.cpp:16906
HostileRefMgr & getHostileRefMgr()
Definition: Unit.h:843
void RemoveFromWorld() override
Definition: Unit.cpp:15682
void RemoveAllAuras()
Definition: Unit.cpp:5319
ThreatMgr & GetThreatMgr()
Definition: Unit.h:839
void Clear(bool reset=true)
Definition: MotionMaster.h:165

References ASSERT, MotionMaster::Clear(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearComboPoints(), CombatStop(), HostileRefMgr::deleteReferences(), Object::GetGUID(), getHostileRefMgr(), GetMotionMaster(), GetThreatMgr(), InterruptNonMeleeSpells(), IsDuringRemoveFromWorld(), Object::IsInWorld(), EventProcessor::KillAllEvents(), m_cleanupDone, m_Events, RemoveAllAuras(), RemoveAllGameObjects(), and RemoveFromWorld().

Referenced by CleanupsBeforeDelete().

◆ CleanupsBeforeDelete()

void Unit::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from WorldObject.

15759{
15760 if (GetTransport())
15761 {
15763 SetTransport(nullptr);
15766 }
15767
15768 CleanupBeforeRemoveFromMap(finalCleanup);
15769}
void RemoveMovementFlag(uint32 flag)
Definition: Object.h:333
void Reset()
Definition: Object.h:287
void SetTransport(Transport *t)
Definition: Object.h:607
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
void CleanupBeforeRemoveFromMap(bool finalCleanup)
Definition: Unit.cpp:15728

References CleanupBeforeRemoveFromMap(), WorldObject::GetTransport(), WorldObject::m_movementInfo, MOVEMENTFLAG_ONTRANSPORT, MovementInfo::RemoveMovementFlag(), Transport::RemovePassenger(), MovementInfo::TransportInfo::Reset(), WorldObject::SetTransport(), and MovementInfo::transport.

Referenced by Player::CleanupsBeforeDelete(), npc_commandscript::HandleNpcAddCommand(), and Map::RemoveAllObjectsInRemoveList().

◆ ClearAllReactives()

void Unit::ClearAllReactives ( )
16915{
16916 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
16917 m_reactiveTimer[i] = 0;
16918
16925}
@ CLASS_CONTEXT_ABILITY_REACTIVE
Definition: UnitDefines.h:214
@ CLASS_HUNTER
Definition: SharedDefines.h:143
@ CLASS_WARRIOR
Definition: SharedDefines.h:141
@ AURA_STATE_DEFENSE
Definition: SharedDefines.h:1292
@ AURA_STATE_HUNTER_PARRY
Definition: SharedDefines.h:1298
virtual bool IsClass(Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
Definition: Unit.h:748
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition: Unit.cpp:10538

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), Object::IsPlayer(), m_reactiveTimer, MAX_REACTIVE, and ModifyAuraState().

Referenced by Player::ActivateSpec(), npc_mograine::npc_mograineAI::DamageTaken(), and setDeathState().

◆ ClearComboPointHolders()

void Unit::ClearComboPointHolders ( )
16907{
16908 while (!m_ComboPointHolders.empty())
16909 {
16910 (*m_ComboPointHolders.begin())->ClearComboPoints(); // this also removes it from m_comboPointHolders
16911 }
16912}

References ClearComboPoints(), and m_ComboPointHolders.

Referenced by CreatureAI::_EnterEvadeMode(), CleanupBeforeRemoveFromMap(), npc_mograine::npc_mograineAI::DamageTaken(), Player::RemoveFromWorld(), and setDeathState().

◆ ClearComboPoints()

void Unit::ClearComboPoints ( )
16852{
16853 if (!m_comboTarget)
16854 {
16855 return;
16856 }
16857
16858 // remove Premed-like effects
16859 // (NB: this Aura retains the CP while it's active - now that CP have reset, it shouldn't be there anymore)
16861
16862 m_comboPoints = 0;
16865 m_comboTarget = nullptr;
16866}
@ SPELL_AURA_RETAIN_COMBO_POINTS
Definition: SpellAuraDefines.h:211

References m_comboPoints, m_comboTarget, RemoveAurasByType(), RemoveComboPointHolder(), SendComboPoints(), and SPELL_AURA_RETAIN_COMBO_POINTS.

Referenced by Spell::_handle_finish_phase(), CleanupBeforeRemoveFromMap(), ClearAllReactives(), ClearComboPointHolders(), Player::DuelComplete(), Player::RemoveFromWorld(), Player::setDeathState(), and UpdateReactives().

◆ ClearDiminishings()

void Unit::ClearDiminishings ( )
inline
932{ m_Diminishing.clear(); }

References m_Diminishing.

Referenced by setDeathState().

◆ ClearInCombat()

void Unit::ClearInCombat ( )
13796{
13797 m_CombatTimer = 0;
13799
13800 // Player's state will be cleared in Player::UpdateContestedPvP
13801 if (Creature* creature = ToCreature())
13802 {
13803 if (creature->GetCreatureTemplate() && creature->GetCreatureTemplate()->unit_flags & UNIT_FLAG_IMMUNE_TO_PC)
13804 SetImmuneToPC(true); // set immunity state to the one from db on evade
13805
13808 ReplaceAllDynamicFlags(creature->GetCreatureTemplate()->dynamicflags);
13809
13810 creature->SetAssistanceTimer(0);
13811
13812 // Xinef: will be recalculated at follow movement generator initialization
13813 if (!IsPet() && !IsCharmed())
13814 return;
13815 }
13816 else if (Player* player = ToPlayer())
13817 {
13818 player->UpdatePotionCooldown();
13819 if (player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
13820 for (uint8 i = 0; i < MAX_RUNES; ++i)
13821 player->SetGracePeriod(i, 0);
13822 }
13823
13824 if (Player* player = this->ToPlayer())
13825 {
13826 sScriptMgr->OnPlayerLeaveCombat(player);
13827 }
13828}
#define MAX_RUNES
Definition: Player.h:398
@ CLASS_CONTEXT_ABILITY
Definition: UnitDefines.h:213
@ UNIT_STATE_ATTACK_PLAYER
Definition: UnitDefines.h:163
@ UNIT_FLAG_IN_COMBAT
Definition: UnitDefines.h:248
@ UNIT_FLAG_IMMUNE_TO_PC
Definition: UnitDefines.h:237
@ CLASS_DEATH_KNIGHT
Definition: SharedDefines.h:146
void ReplaceAllDynamicFlags(uint32 flag) override
Definition: Unit.h:700
bool IsCharmed() const
Definition: Unit.h:1278
bool IsPet() const
Definition: Unit.h:710
void SetImmuneToPC(bool apply, bool keepCombat=false)
Definition: Unit.cpp:13597
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition: Unit.h:684

References CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, ClearUnitState(), Object::HasDynamicFlag(), IsCharmed(), IsPet(), m_CombatTimer, MAX_RUNES, RemoveUnitFlag(), ReplaceAllDynamicFlags(), SetImmuneToPC(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_DYNFLAG_TAPPED, UNIT_FLAG_IMMUNE_TO_PC, UNIT_FLAG_IN_COMBAT, and UNIT_STATE_ATTACK_PLAYER.

Referenced by CombatStop(), Player::LoadFromDB(), and Update().

◆ ClearInPetCombat()

◆ ClearUnitState()

void Unit::ClearUnitState ( uint32  f)
inline
674{ m_state &= ~f; }

References m_state.

Referenced by Spell::_cast(), HomeMovementGenerator< Creature >::_setTargetLocation(), Attack(), FollowerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), AttackStop(), ClearInCombat(), boss_thorim::boss_thorimAI::DisableThorim(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), HomeMovementGenerator< Creature >::DoFinalize(), WaypointMovementGenerator< Creature >::DoFinalize(), RandomMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), RandomMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), Spell::EffectResurrectPet(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_ayamiss::EnterEvadeMode(), SmartAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), TimedFleeingMovementGenerator::Finalize(), RotateMovementGenerator::Finalize(), DistractMovementGenerator::Finalize(), AssistanceDistractMovementGenerator::Finalize(), Spell::finish(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), SmartAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), MotionMaster::MoveTargetedHome(), WaypointMovementGenerator< Creature >::OnArrived(), boss_nightbane::PathEndReached(), Creature::ReleaseFocus(), RemoveCharmedBy(), MotionTransport::RemovePassenger(), boss_ayamiss::Reset(), boss_hungarfen::Reset(), Player::ResetContestedPvP(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SetClientControl(), SetControlled(), Creature::setDeathState(), Player::setDeathState(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Player::SetIsSpectator(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), StopMoving(), StopMovingOnCurrentPos(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), and boss_the_lich_king::boss_the_lich_kingAI::UpdateAI().

◆ CombatStart()

void Unit::CombatStart ( Unit target,
bool  initialAggro = true 
)
13616{
13617 // Xinef: Dont allow to start combat with triggers
13618 if (victim->IsCreature() && victim->ToCreature()->IsTrigger())
13619 return;
13620
13621 if (initialAggro)
13622 {
13623 // Make player victim stand up automatically
13624 if (victim->getStandState() && victim->IsPlayer())
13625 {
13626 victim->SetStandState(UNIT_STAND_STATE_STAND);
13627 }
13628
13629 if (!victim->IsInCombat() && !victim->IsPlayer() && !victim->ToCreature()->HasReactState(REACT_PASSIVE) && victim->ToCreature()->IsAIEnabled)
13630 {
13631 if (victim->IsPet())
13632 victim->ToCreature()->AI()->AttackedBy(this); // PetAI has special handler before AttackStart()
13633 else
13634 {
13635 victim->ToCreature()->AI()->AttackStart(this);
13636 // if the target is an NPC with a pet or minion, pet should react.
13637 if (Unit* victimControlledUnit = victim->GetFirstControlled())
13638 {
13639 victimControlledUnit->SetInCombatWith(this);
13640 SetInCombatWith(victimControlledUnit);
13641 victimControlledUnit->AddThreat(this, 0.0f);
13642 }
13643 }
13644
13645 // if unit has an owner, put owner in combat.
13646 if (Unit* victimOwner = victim->GetOwner())
13647 {
13648 if (!(victimOwner->IsInCombatWith(this)))
13649 {
13650 /* warding off to not take over aggro for no reason
13651 Using only AddThreat causes delay in attack */
13652 if (!victimOwner->IsInCombat() && victimOwner->IsAIEnabled)
13653 {
13654 victimOwner->ToCreature()->AI()->AttackStart(this);
13655 }
13656 victimOwner->SetInCombatWith(this);
13657 SetInCombatWith(victimOwner);
13658 victimOwner->AddThreat(this, 0.0f);
13659 }
13660 }
13661 }
13662
13663 bool alreadyInCombat = IsInCombat();
13664
13665 SetInCombatWith(victim);
13666 victim->SetInCombatWith(this);
13667
13668 // Xinef: If pet started combat - put owner in combat
13669 if (!alreadyInCombat && IsInCombat())
13670 {
13671 if (Unit* owner = GetOwner())
13672 {
13673 owner->SetInCombatWith(victim);
13674 victim->SetInCombatWith(owner);
13675 }
13676 }
13677 }
13678
13679 Unit* who = victim->GetCharmerOrOwnerOrSelf();
13680 if (who->IsPlayer())
13681 SetContestedPvP(who->ToPlayer());
13682
13684 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13685 {
13686 player->UpdatePvP(true);
13688 }
13689}
@ AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT
Definition: SpellDefines.h:66
@ REACT_PASSIVE
Definition: Unit.h:548
@ UNIT_STAND_STATE_STAND
Definition: UnitDefines.h:32
void UpdatePvP(bool state, bool _override=false)
Definition: PlayerUpdates.cpp:1480
Unit * GetCharmerOrOwnerOrSelf() const
Definition: Unit.h:1256
void SetContestedPvP(Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
Definition: Unit.cpp:17235
Unit * GetFirstControlled() const
Definition: Unit.cpp:11061
bool IsInCombat() const
Definition: Unit.h:820

References Creature::AI(), CreatureAI::AttackedBy(), UnitAI::AttackStart(), AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetFirstControlled(), GetOwner(), getStandState(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), IsInCombat(), IsPet(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), REACT_PASSIVE, RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), SetStandState(), Object::ToCreature(), Object::ToPlayer(), UNIT_STAND_STATE_STAND, and Player::UpdatePvP().

Referenced by AttackerStateUpdate(), Spell::CheckCast(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectTaunt(), and AssistDelayEvent::Execute().

◆ CombatStartOnCast()

void Unit::CombatStartOnCast ( Unit target,
bool  initialAggro = true,
uint32  duration = 0 
)
13692{
13693 // Xinef: Dont allow to start combat with triggers
13694 if (target->IsCreature() && target->ToCreature()->IsTrigger())
13695 return;
13696
13697 if (initialAggro)
13698 {
13699 SetInCombatWith(target, duration);
13700
13701 // Xinef: If pet started combat - put owner in combat
13702 if (Unit* owner = GetOwner())
13703 owner->SetInCombatWith(target, duration);
13704 }
13705
13706 Unit* who = target->GetCharmerOrOwnerOrSelf();
13707 if (who->IsPlayer())
13708 SetContestedPvP(who->ToPlayer());
13709
13711 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13712 {
13713 player->UpdatePvP(true);
13715 }
13716}
bool IsTrigger() const
Definition: Creature.h:78

References AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetOwner(), Object::IsCreature(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), Object::ToCreature(), Object::ToPlayer(), and Player::UpdatePvP().

Referenced by Spell::_cast().

◆ CombatStop()

void Unit::CombatStop ( bool  includingCast = false)
10428{
10429 if (includingCast && IsNonMeleeSpellCast(false))
10431
10432 AttackStop();
10434 if (IsPlayer())
10435 ToPlayer()->SendAttackSwingCancelAttack(); // melee and ranged forced attack cancel
10436 if (Creature* pCreature = ToCreature())
10437 pCreature->ClearLastLeashExtensionTimePtr();
10438 ClearInCombat();
10439
10440 // xinef: just in case
10441 if (IsPetInCombat() && !IsPlayer())
10443}
void SendAttackSwingCancelAttack()
Definition: PlayerMisc.cpp:140
bool IsPetInCombat() const
Definition: Unit.h:823
void ClearInPetCombat()
Definition: Unit.cpp:13830
void RemoveAllAttackers()
Remove all units in m_attackers list and send them AttackStop()
Definition: Unit.cpp:10475
void ClearInCombat()
Definition: Unit.cpp:13795
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition: Unit.cpp:10394

References AttackStop(), ClearInCombat(), ClearInPetCombat(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), IsPetInCombat(), Object::IsPlayer(), RemoveAllAttackers(), Player::SendAttackSwingCancelAttack(), Object::ToCreature(), and Object::ToPlayer().

Referenced by CreatureAI::_EnterEvadeMode(), PetAI::_stopAttack(), Player::ActivateTaxiPathTo(), CleanupBeforeRemoveFromMap(), CombatStopWithPets(), boss_felblood_kaelthas::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_maiev_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSanctuary(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), TotemAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleCombatStopCommand(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), npc_commandscript::HandleNpcDeleteCommand(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), SmartScript::ProcessAction(), Player::RemovePet(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), setDeathState(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), Player::TeleportTo(), Totem::UnSummon(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ CombatStopWithPets()

void Unit::CombatStopWithPets ( bool  includingCast = false)
10446{
10447 CombatStop(includingCast);
10448
10449 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10450 (*itr)->CombatStop(includingCast);
10451}

References CombatStop(), and m_Controlled.

Referenced by DealDamage(), WorldSession::HandleDuelCancelledOpcode(), Player::SetGameMaster(), Player::SetGMVisible(), and Player::UpdateArea().

◆ CountPctFromCurHealth()

uint32 Unit::CountPctFromCurHealth ( int32  pct) const
inline
879{ return CalculatePct(GetHealth(), pct); }
uint32 GetHealth() const
Definition: Unit.h:869

References CalculatePct(), and GetHealth().

Referenced by spell_gen_leeching_swarm::spell_gen_leeching_swarm_AuraScript::HandleEffectPeriodic().

◆ CountPctFromMaxHealth()

uint32 Unit::CountPctFromMaxHealth ( int32  pct) const
inline
878{ return CalculatePct(GetMaxHealth(), pct); }
uint32 GetMaxHealth() const
Definition: Unit.h:870

References CalculatePct(), and GetMaxHealth().

Referenced by spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_dk_anti_magic_shell_self::CalculateAmount(), spell_dk_vampiric_blood::CalculateAmount(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::EffectHeal(), Spell::EffectHealPct(), Spell::EffectResurrect(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonType(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), spell_dk_death_strike::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_warr_last_stand::HandleDummy(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), boss_harbinger_skyriss::JustSummoned(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Pet::LoadPetFromDB(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_zuljin::boss_zuljinAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), and npc_injured_patient::npc_injured_patientAI::UpdateAI().

◆ CreateTamedPetFrom() [1/2]

Pet * Unit::CreateTamedPetFrom ( Creature creatureTarget,
uint32  spell_id = 0 
)
17339{
17340 if (!IsPlayer())
17341 return nullptr;
17342
17343 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17344
17345 if (!pet->CreateBaseAtCreature(creatureTarget))
17346 {
17347 delete pet;
17348 return nullptr;
17349 }
17350
17351 uint8 level = creatureTarget->GetLevel() + 5 < GetLevel() ? (GetLevel() - 5) : creatureTarget->GetLevel();
17352
17353 if (!InitTamedPet(pet, level, spell_id))
17354 {
17355 delete pet;
17356 return nullptr;
17357 }
17358
17359 return pet;
17360}
@ HUNTER_PET
Definition: PetDefines.h:32
bool CreateBaseAtCreature(Creature *creature)
Definition: Pet.cpp:944
bool InitTamedPet(Pet *pet, uint8 level, uint32 spell_id)
Definition: Unit.cpp:17382

References Pet::CreateBaseAtCreature(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), and Object::ToPlayer().

Referenced by Player::CreatePet(), Spell::EffectCreateTamedPet(), and Spell::EffectTameCreature().

◆ CreateTamedPetFrom() [2/2]

Pet * Unit::CreateTamedPetFrom ( uint32  creatureEntry,
uint32  spell_id = 0 
)
17363{
17364 if (!IsPlayer())
17365 return nullptr;
17366
17367 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creatureEntry);
17368 if (!creatureInfo)
17369 return nullptr;
17370
17371 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17372
17373 if (!pet->CreateBaseAtCreatureInfo(creatureInfo, this) || !InitTamedPet(pet, GetLevel(), spell_id))
17374 {
17375 delete pet;
17376 return nullptr;
17377 }
17378
17379 return pet;
17380}
#define sObjectMgr
Definition: ObjectMgr.h:1633
Definition: CreatureData.h:187
bool CreateBaseAtCreatureInfo(CreatureTemplate const *cinfo, Unit *owner)
Definition: Pet.cpp:979

References Pet::CreateBaseAtCreatureInfo(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), sObjectMgr, and Object::ToPlayer().

◆ CreateVehicleKit()

bool Unit::CreateVehicleKit ( uint32  id,
uint32  creatureEntry 
)
18703{
18704 VehicleEntry const* vehInfo = sVehicleStore.LookupEntry(id);
18705 if (!vehInfo)
18706 return false;
18707
18708 m_vehicleKit = new Vehicle(this, vehInfo, creatureEntry);
18711 return true;
18712}
DBCStorage< VehicleEntry > sVehicleStore(VehicleEntryfmt)
@ UNIT_MASK_VEHICLE
Definition: UnitDefines.h:140
@ UPDATEFLAG_VEHICLE
Definition: UpdateData.h:46

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, sVehicleStore, UNIT_MASK_VEHICLE, and UPDATEFLAG_VEHICLE.

Referenced by Creature::CreateFromProto(), AuraEffect::HandleAuraSetVehicle(), Mount(), and npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit().

◆ DealDamage()

uint32 Unit::DealDamage ( Unit attacker,
Unit victim,
uint32  damage,
CleanDamage const *  cleanDamage = nullptr,
DamageEffectType  damagetype = DIRECT_DAMAGE,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  spellProto = nullptr,
bool  durabilityLoss = true,
bool  allowGM = false,
Spell const *  spell = nullptr 
)
static

@fix: Hack to avoid premature leashing

811{
812 // Xinef: initialize damage done for rage calculations
813 // Xinef: its rare to modify damage in hooks, however training dummy's sets damage to 0
814 uint32 rage_damage = damage + ((cleanDamage != nullptr) ? cleanDamage->absorbed_damage : 0);
815
816 //if (attacker)
817 {
818 if (victim->IsAIEnabled)
819 victim->GetAI()->DamageTaken(attacker, damage, damagetype, damageSchoolMask);
820
821 if (attacker && attacker->IsAIEnabled)
822 attacker->GetAI()->DamageDealt(victim, damage, damagetype);
823 }
824
825 // Hook for OnDamage Event
826 sScriptMgr->OnDamage(attacker, victim, damage);
827
828 if (victim->IsPlayer() && attacker != victim)
829 {
830 // Signal to pets that their owner was attacked
831 Pet* pet = victim->ToPlayer()->GetPet();
832
833 if (pet && pet->IsAlive())
834 pet->AI()->OwnerAttackedBy(attacker);
835 }
836
837 //Dont deal damage to unit if .cheat god is enable.
838 if (victim->IsPlayer())
839 {
840 if (victim->ToPlayer()->GetCommandStatus(CHEAT_GOD))
841 {
842 return 0;
843 }
844 }
845
846 // Signal the pet it was attacked so the AI can respond if needed
847 if (victim->IsCreature() && attacker != victim && victim->IsPet() && victim->IsAlive())
848 victim->ToPet()->AI()->AttackedBy(attacker);
849
850 if (damagetype != NODAMAGE)
851 {
852 // interrupting auras with AURA_INTERRUPT_FLAG_DAMAGE before checking !damage (absorbed damage breaks that type of auras)
853 if (spellProto)
854 {
855 if (!spellProto->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
857 }
858 else
860
861 // interrupt spells with SPELL_INTERRUPT_FLAG_ABORT_ON_DMG on absorbed damage (no dots)
862 if (!damage && damagetype != DOT && cleanDamage && cleanDamage->absorbed_damage)
863 {
864 if (victim != attacker && victim->IsPlayer())
865 {
866 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
867 {
868 if (spell->getState() == SPELL_STATE_PREPARING)
869 {
870 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
871 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
872 {
873 victim->InterruptNonMeleeSpells(false);
874 }
875 }
876 }
877 }
878 }
879
880 // We're going to call functions which can modify content of the list during iteration over it's elements
881 // Let's copy the list so we can prevent iterator invalidation
883 // copy damage to casters of this aura
884 for (AuraEffectList::iterator i = vCopyDamageCopy.begin(); i != vCopyDamageCopy.end(); ++i)
885 {
886 // Check if aura was removed during iteration - we don't need to work on such auras
887 if (!((*i)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
888 continue;
889 // check damage school mask
890 if (((*i)->GetMiscValue() & damageSchoolMask) == 0)
891 continue;
892
893 Unit* shareDamageTarget = (*i)->GetCaster();
894 if (!shareDamageTarget)
895 continue;
896 SpellInfo const* spell = (*i)->GetSpellInfo();
897
898 uint32 shareDamage = CalculatePct(damage, (*i)->GetAmount());
899
900 uint32 shareAbsorb = 0;
901 uint32 shareResist = 0;
902
903 if (shareDamageTarget->IsImmunedToDamageOrSchool(damageSchoolMask))
904 {
905 shareAbsorb = shareDamage;
906 shareDamage = 0;
907 }
908 else
909 {
910 DamageInfo sharedDamageInfo(attacker, shareDamageTarget, shareDamage, spellProto, damageSchoolMask, damagetype);
911 Unit::CalcAbsorbResist(sharedDamageInfo, true);
912 shareAbsorb = sharedDamageInfo.GetAbsorb();
913 shareResist = sharedDamageInfo.GetResist();
914 shareDamage = sharedDamageInfo.GetDamage();
915 Unit::DealDamageMods(shareDamageTarget, shareDamage, &shareAbsorb);
916 }
917
918 if (attacker && shareDamageTarget->IsPlayer())
919 {
920 attacker->SendSpellNonMeleeDamageLog(shareDamageTarget, spell, shareDamage, damageSchoolMask, shareAbsorb, shareResist, damagetype == DIRECT_DAMAGE, 0, false, true);
921 }
922
923 Unit::DealDamage(attacker, shareDamageTarget, shareDamage, cleanDamage, NODAMAGE, damageSchoolMask, spellProto, false, false, damageSpell);
924 }
925 }
926
927 // Rage from Damage made (only from direct weapon damage)
928 if (attacker && cleanDamage && damagetype == DIRECT_DAMAGE && attacker != victim && attacker->HasActivePowerType(POWER_RAGE))
929 {
930 uint32 weaponSpeedHitFactor;
931
932 switch (cleanDamage->attackType)
933 {
934 case BASE_ATTACK:
935 case OFF_ATTACK:
936 {
937 weaponSpeedHitFactor = uint32(attacker->GetAttackTime(cleanDamage->attackType) / 1000.0f * (cleanDamage->attackType == BASE_ATTACK ? 3.5f : 1.75f));
938 if (cleanDamage->hitOutCome == MELEE_HIT_CRIT)
939 weaponSpeedHitFactor *= 2;
940
941 attacker->RewardRage(rage_damage, weaponSpeedHitFactor, true);
942 break;
943 }
944 case RANGED_ATTACK:
945 break;
946 default:
947 break;
948 }
949 }
950
951 if (!damage)
952 {
953 // Rage from absorbed damage
954 if (cleanDamage && cleanDamage->absorbed_damage)
955 {
956 if (victim->HasActivePowerType(POWER_RAGE))
957 victim->RewardRage(cleanDamage->absorbed_damage, 0, false);
958
959 if (attacker && attacker->HasActivePowerType(POWER_RAGE))
960 attacker->RewardRage(cleanDamage->absorbed_damage, 0, true);
961 }
962
963 return 0;
964 }
965
966 LOG_DEBUG("entities.unit", "DealDamageStart");
967
968 uint32 health = victim->GetHealth();
969 LOG_DEBUG("entities.unit", "deal dmg:{} to health:{} ", damage, health);
970
971 // duel ends when player has 1 or less hp
972 bool duel_hasEnded = false;
973 bool duel_wasMounted = false;
974 if (victim->IsPlayer() && victim->ToPlayer()->duel && damage >= (health - 1))
975 {
976 // xinef: situation not possible earlier, just return silently.
977 if (!attacker)
978 return 0;
979
980 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
981 if (victim->ToPlayer()->duel->Opponent == attacker || victim->ToPlayer()->duel->Opponent->GetGUID() == attacker->GetOwnerGUID())
982 damage = health - 1;
983
984 duel_hasEnded = true;
985 }
986 else if (victim->IsVehicle() && damage >= (health - 1) && victim->GetCharmer() && victim->GetCharmer()->IsPlayer())
987 {
988 Player* victimRider = victim->GetCharmer()->ToPlayer();
989
990 if (victimRider && victimRider->duel && victimRider->duel->IsMounted)
991 {
992 // xinef: situation not possible earlier, just return silently.
993 if (!attacker)
994 return 0;
995
996 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
997 if (victimRider->duel->Opponent == attacker || victimRider->duel->Opponent->GetGUID() == attacker->GetCharmerGUID())
998 damage = health - 1;
999
1000 duel_wasMounted = true;
1001 duel_hasEnded = true;
1002 }
1003 }
1004
1005 if (attacker && attacker != victim)
1006 if (Player* killer = attacker->GetCharmerOrOwnerPlayerOrPlayerItself())
1007 {
1008 // pussywizard: don't allow GMs to deal damage in normal way (this leaves no evidence in logs!), they have commands to do so
1009 //if (!allowGM && killer->GetSession()->GetSecurity() && killer->GetSession()->GetSecurity() <= SEC_ADMINISTRATOR)
1010 // return 0;
1011
1012 if (Battleground* bg = killer->GetBattleground())
1013 {
1014 bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage);
1015 killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, damage, 0, victim); // pussywizard: InBattleground() optimization
1016 }
1017 //killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage); // pussywizard: optimization
1018 }
1019
1020 if (victim->IsPlayer())
1021 ;//victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage); // pussywizard: optimization
1022 else if (!victim->IsControlledByPlayer() || victim->IsVehicle())
1023 {
1024 if (!victim->ToCreature()->hasLootRecipient())
1025 victim->ToCreature()->SetLootRecipient(attacker);
1026
1027 if (!attacker || attacker->IsControlledByPlayer() || attacker->IsCreatedByPlayer())
1028 {
1029 uint32 unDamage = health < damage ? health : damage;
1030 bool damagedByPlayer = unDamage && attacker && (attacker->IsPlayer() || attacker->m_movedByPlayer != nullptr);
1031 victim->ToCreature()->LowerPlayerDamageReq(unDamage, damagedByPlayer);
1032 }
1033 }
1034
1035 if (health <= damage)
1036 {
1037 LOG_DEBUG("entities.unit", "DealDamage: victim just died");
1038
1039 //if (attacker && victim->IsPlayer() && victim != attacker)
1040 //victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health); // pussywizard: optimization
1041 Unit::Kill(attacker, victim, durabilityLoss, cleanDamage ? cleanDamage->attackType : BASE_ATTACK, spellProto, damageSpell);
1042 }
1043 else
1044 {
1045 LOG_DEBUG("entities.unit", "DealDamageAlive");
1046
1047 //if (victim->IsPlayer())
1048 // victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, damage); // pussywizard: optimization
1049
1050 victim->ModifyHealth(- (int32)damage);
1051
1052 if (damagetype == DIRECT_DAMAGE || damagetype == SPELL_DIRECT_DAMAGE)
1053 victim->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, spellProto ? spellProto->Id : 0);
1054
1055 if (!victim->IsPlayer())
1056 {
1058 if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD)))
1060
1061 if (attacker)
1062 {
1063 if (spellProto && victim->CanHaveThreatList() && !victim->HasUnitState(UNIT_STATE_EVADE) && !victim->IsInCombatWith(attacker))
1064 {
1065 victim->CombatStart(attacker, !(spellProto->AttributesEx3 & SPELL_ATTR3_SUPPRESS_TARGET_PROCS));
1066 }
1067
1068 victim->AddThreat(attacker, float(damage), damageSchoolMask, spellProto);
1069 }
1070 }
1071 else // victim is a player
1072 {
1073 // random durability for items (HIT TAKEN)
1075 {
1078 }
1079 }
1080
1081 // Rage from damage received
1082 if (attacker != victim && victim->HasActivePowerType(POWER_RAGE))
1083 {
1084 uint32 rageDamage = damage + (cleanDamage ? cleanDamage->absorbed_damage : 0);
1085 victim->RewardRage(rageDamage, 0, false);
1086 }
1087
1088 if (attacker && attacker->IsPlayer())
1089 {
1090 // random durability for items (HIT DONE)
1092 {
1094 attacker->ToPlayer()->DurabilityPointLossForEquipSlot(slot);
1095 }
1096 }
1097
1098 if (damagetype != NODAMAGE && damage && (!spellProto || !(spellProto->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC) || spellProto->HasAttribute(SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK))))
1099 {
1100 if (victim != attacker && victim->IsPlayer()) // does not support creature push_back
1101 {
1102 if (damagetype != DOT && !(damageSpell && damageSpell->m_targets.HasDstChannel()))
1103 {
1104 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
1105 {
1106 if (spell->getState() == SPELL_STATE_PREPARING)
1107 {
1108 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
1109 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
1110 {
1111 victim->InterruptNonMeleeSpells(false);
1112 }
1113 else if (interruptFlags & SPELL_INTERRUPT_FLAG_PUSH_BACK)
1114 {
1115 spell->Delayed();
1116 }
1117 }
1118 }
1119
1120 if (Spell* spell = victim->m_currentSpells[CURRENT_CHANNELED_SPELL])
1121 if (spell->getState() == SPELL_STATE_CASTING)
1122 {
1123 if ((spell->m_spellInfo->ChannelInterruptFlags & CHANNEL_FLAG_DELAY) != 0)
1124 {
1125 spell->DelayedChannel();
1126 }
1127 }
1128 }
1129 }
1130 }
1131
1132 // last damage from duel opponent
1133 if (duel_hasEnded)
1134 {
1135 Player* he = duel_wasMounted ? victim->GetCharmer()->ToPlayer() : victim->ToPlayer();
1136
1137 ASSERT_NODEBUGINFO(he && he->duel);
1138
1139 if (duel_wasMounted) // In this case victim==mount
1140 victim->SetHealth(1);
1141 else
1142 he->SetHealth(1);
1143
1144 he->duel->Opponent->CombatStopWithPets(true);
1145 he->CombatStopWithPets(true);
1146
1147 he->CastSpell(he, 7267, true); // beg
1149 }
1150 }
1151
1152 LOG_DEBUG("entities.unit", "DealDamageEnd returned {} damage", damage);
1153
1154 return damage;
1155}
bool roll_chance_f(float chance)
Definition: Random.h:53
#define ASSERT_NODEBUGINFO
Definition: Errors.h:69
@ CHANNEL_FLAG_DELAY
Definition: SpellDefines.h:38
@ AURA_INTERRUPT_FLAG_TAKE_DAMAGE
Definition: SpellDefines.h:44
@ AURA_INTERRUPT_FLAG_DIRECT_DAMAGE
Definition: SpellDefines.h:67
@ SPELL_INTERRUPT_FLAG_ABORT_ON_DMG
Definition: SpellDefines.h:30
@ SPELL_INTERRUPT_FLAG_PUSH_BACK
Definition: SpellDefines.h:27
@ SPELL_AURA_DAMAGE_SHIELD
Definition: SpellAuraDefines.h:78
@ SPELL_AURA_SHARE_DAMAGE_PCT
Definition: SpellAuraDefines.h:363
@ SPELL_STATE_PREPARING
Definition: Spell.h:224
@ SPELL_STATE_CASTING
Definition: Spell.h:225
@ RATE_DURABILITY_LOSS_DAMAGE
Definition: IWorld.h:513
@ CHEAT_GOD
Definition: Player.h:999
EquipmentSlots
Definition: Player.h:673
@ EQUIPMENT_SLOT_END
Definition: Player.h:694
@ NODAMAGE
Definition: Unit.h:252
@ CURRENT_CHANNELED_SPELL
Definition: Unit.h:539
@ CURRENT_GENERIC_SPELL
Definition: Unit.h:538
@ SCORE_DAMAGE_DONE
Definition: BattlegroundScore.h:32
@ POWER_RAGE
Definition: SharedDefines.h:270
@ SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK
Definition: SharedDefines.h:647
@ SPELL_ATTR3_TREAT_AS_PERIODIC
Definition: SharedDefines.h:518
@ SPELL_ATTR3_SUPPRESS_TARGET_PROCS
Definition: SharedDefines.h:510
@ DUEL_WON
Definition: SharedDefines.h:3613
@ SPELL_ATTR4_REACTIVE_DAMAGE_PROC
Definition: SharedDefines.h:544
@ ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE
Definition: DBCEnums.h:130
virtual void DamageTaken(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Called at any Damage from any attacker (before damage apply)
Definition: UnitAI.h:369
virtual void DamageDealt(Unit *, uint32 &, DamageEffectType)
Called at any Damage to any victim (before damage apply)
Definition: UnitAI.h:362
virtual void OwnerAttackedBy(Unit *)
Definition: CreatureAI.h:171
virtual void AttackedBy(Unit *)
Definition: CreatureAI.h:148
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition: Creature.cpp:1319
bool hasLootRecipient() const
Definition: Creature.h:234
void UpdateLeashExtensionTime()
Definition: Creature.cpp:3712
void LowerPlayerDamageReq(uint32 unDamage, bool damagedByPlayer=true)
Definition: Creature.cpp:3805
bool IsPlayer() const
Definition: ObjectGuid.h:168
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition: PlayerUpdates.cpp:2127
void DurabilityPointLossForEquipSlot(EquipmentSlots slot)
Definition: Player.cpp:4804
Pet * GetPet() const
Definition: Player.cpp:8906
bool GetCommandStatus(uint32 command) const
Definition: Player.h:1178
int32 ModifyHealth(int32 val)
Definition: Unit.cpp:14077
Pet * ToPet()
Definition: Unit.h:1728
bool IsCreatedByPlayer() const
Definition: Unit.h:1237
Unit * GetCharmer() const
Definition: Unit.cpp:10599
static void Kill(Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
Definition: Unit.cpp:17689
void RewardRage(uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
Definition: Unit.cpp:20123
void SetHealth(uint32 val)
Definition: Unit.cpp:15464
ObjectGuid GetCharmerGUID() const
Definition: Unit.h:1228
virtual bool HasActivePowerType(Powers power)
Definition: Unit.h:890
void CombatStopWithPets(bool includingCast=false)
Definition: Unit.cpp:10445
uint32 ChannelInterruptFlags
Definition: SpellInfo.h:354
uint32 InterruptFlags
Definition: SpellInfo.h:352

References CleanDamage::absorbed_damage, ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, AddThreat(), Creature::AI(), ASSERT_NODEBUGINFO, CreatureAI::AttackedBy(), CleanDamage::attackType, SpellInfo::AttributesEx3, AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, AURA_INTERRUPT_FLAG_TAKE_DAMAGE, BASE_ATTACK, CalcAbsorbResist(), CalculatePct(), CanHaveThreatList(), CastSpell(), CHANNEL_FLAG_DELAY, CHEAT_GOD, CombatStart(), CombatStopWithPets(), CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, UnitAI::DamageDealt(), UnitAI::DamageTaken(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, DOT, Player::duel, DUEL_WON, Player::DuelComplete(), Player::DurabilityPointLossForEquipSlot(), EQUIPMENT_SLOT_END, DamageInfo::GetAbsorb(), GetAI(), GetAttackTime(), GetAuraEffectsByType(), GetCharmer(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), Player::GetCommandStatus(), DamageInfo::GetDamage(), Object::GetGUID(), GetHealth(), GetOwnerGUID(), Player::GetPet(), DamageInfo::GetResist(), HasActivePowerType(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellCastTargets::HasDstChannel(), Creature::hasLootRecipient(), HasUnitState(), CleanDamage::hitOutCome, SpellInfo::Id, InterruptNonMeleeSpells(), IsAIEnabled, IsAlive(), IsControlledByPlayer(), IsCreatedByPlayer(), Object::IsCreature(), IsImmunedToDamageOrSchool(), IsInCombatWith(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), IsVehicle(), Kill(), LOG_DEBUG, Creature::LowerPlayerDamageReq(), m_currentSpells, m_movedByPlayer, Spell::m_targets, MELEE_HIT_CRIT, ModifyHealth(), NODAMAGE, OFF_ATTACK, CreatureAI::OwnerAttackedBy(), POWER_RAGE, RANGED_ATTACK, RATE_DURABILITY_LOSS_DAMAGE, RemoveAurasWithInterruptFlags(), RewardRage(), roll_chance_f(), SCORE_DAMAGE_DONE, SendSpellNonMeleeDamageLog(), SetHealth(), Creature::SetLootRecipient(), SPELL_ATTR3_SUPPRESS_TARGET_PROCS, SPELL_ATTR3_TREAT_AS_PERIODIC, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK, SPELL_AURA_DAMAGE_SHIELD, SPELL_AURA_SHARE_DAMAGE_PCT, SPELL_DIRECT_DAMAGE, SPELL_INTERRUPT_FLAG_ABORT_ON_DMG, SPELL_INTERRUPT_FLAG_PUSH_BACK, SPELL_STATE_CASTING, SPELL_STATE_PREPARING, sScriptMgr, sWorld, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_STATE_EVADE, Player::UpdateAchievementCriteria(), Creature::UpdateLeashExtensionTime(), and urand().

Referenced by CalcAbsorbResist(), DealDamage(), DealMeleeDamage(), DealSpellDamage(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectInstaKill(), Player::EnvironmentalDamage(), spell_mt_phoenix_burn::HandleAfterCast(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), spell_svala_ritual_strike::HandleDummyEffect(), spell_lady_vashj_magic_barrier::HandleEffectRemove(), spell_algalon_collapse_aura::HandlePeriodic(), spell_kaelthas_burn::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_gluth_decimate::HandleScriptEffect(), boss_akilzon::boss_akilzonAI::HandleStormSequence(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::JustDied(), spell_valkyr_touch::spell_valkyr_touchAuraScript::PrepareAuraScript(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ DealDamageMods()

◆ DealHeal()

int32 Unit::DealHeal ( Unit healer,
Unit victim,
uint32  addhealth 
)
static
10938{
10939 int32 gain = 0;
10940
10941 if (healer)
10942 {
10943 if (victim->IsAIEnabled)
10944 victim->GetAI()->HealReceived(healer, addhealth);
10945
10946 if (healer->IsAIEnabled)
10947 healer->GetAI()->HealDone(victim, addhealth);
10948 }
10949
10950 if (addhealth)
10951 gain = victim->ModifyHealth(int32(addhealth));
10952
10953 // Hook for OnHeal Event
10954 sScriptMgr->OnHeal(healer, victim, (uint32&)gain);
10955
10956 Unit* unit = healer;
10957
10958 if (healer && healer->IsCreature() && healer->ToCreature()->IsTotem())
10959 unit = healer->GetOwner();
10960
10961 if (!unit)
10962 return gain;
10963
10964 if (Player* player = unit->ToPlayer())
10965 {
10966 if (Battleground* bg = player->GetBattleground())
10967 bg->UpdatePlayerScore(player, SCORE_HEALING_DONE, gain);
10968
10969 // use the actual gain, as the overheal shall not be counted, skip gain 0 (it ignored anyway in to criteria)
10970 if (gain && player->InBattleground()) // pussywizard: InBattleground() optimization
10971 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain, 0, victim);
10972
10973 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); // pussywizard: optimization
10974 }
10975
10976 /*if (Player* player = victim->ToPlayer())
10977 {
10978 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); // pussywizard: optimization
10979 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth); // pussywizard: optimization
10980 }*/
10981
10982 return gain;
10983}
@ SCORE_HEALING_DONE
Definition: BattlegroundScore.h:33
@ ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE
Definition: DBCEnums.h:169
virtual void HealReceived(Unit *, uint32 &)
Called when the creature receives heal.
Definition: UnitAI.h:372
virtual void HealDone(Unit *, uint32 &)
Called when the unit heals.
Definition: UnitAI.h:378

References ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, GetAI(), GetOwner(), UnitAI::HealDone(), UnitAI::HealReceived(), IsAIEnabled, Object::IsCreature(), IsTotem(), ModifyHealth(), SCORE_HEALING_DONE, sScriptMgr, Object::ToCreature(), and Object::ToPlayer().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), HealBySpell(), and npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI().

◆ DealMeleeDamage()

void Unit::DealMeleeDamage ( CalcDamageInfo damageInfo,
bool  durabilityLoss 
)
Todo:
: Move this to a packet handler
1830{
1831 Unit* victim = damageInfo->target;
1832
1833 auto canTakeMeleeDamage = [&]()
1834 {
1835 return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (!victim->IsCreature() || !victim->ToCreature()->IsEvadingAttacks());
1836 };
1837
1838 if (!canTakeMeleeDamage())
1839 {
1840 return;
1841 }
1842
1843 // Hmmmm dont like this emotes client must by self do all animations
1844 if (damageInfo->HitInfo & HITINFO_CRITICALHIT)
1846 if (damageInfo->blocked_amount && damageInfo->TargetState != VICTIMSTATE_BLOCKS)
1848
1849 // Parry haste is enabled if it's not a creature or if the creature doesn't have the NO_PARRY_HASTEN flag.
1850 bool isParryHasteEnabled = !victim->IsCreature() ||
1852 if (damageInfo->TargetState == VICTIMSTATE_PARRY && isParryHasteEnabled)
1853 {
1854 // Get attack timers
1855 float offtime = float(victim->getAttackTimer(OFF_ATTACK));
1856 float basetime = float(victim->getAttackTimer(BASE_ATTACK));
1857 // Reduce attack time
1858 if (victim->HasOffhandWeaponForAttack() && offtime < basetime)
1859 {
1860 float percent20 = victim->GetAttackTime(OFF_ATTACK) * 0.20f;
1861 float percent60 = 3.0f * percent20;
1862 if (offtime > percent20 && offtime <= percent60)
1863 victim->setAttackTimer(OFF_ATTACK, uint32(percent20));
1864 else if (offtime > percent60)
1865 {
1866 offtime -= 2.0f * percent20;
1867 victim->setAttackTimer(OFF_ATTACK, uint32(offtime));
1868 }
1869 }
1870 else
1871 {
1872 float percent20 = victim->GetAttackTime(BASE_ATTACK) * 0.20f;
1873 float percent60 = 3.0f * percent20;
1874 if (basetime > percent20 && basetime <= percent60)
1875 victim->setAttackTimer(BASE_ATTACK, uint32(percent20));
1876 else if (basetime > percent60)
1877 {
1878 basetime -= 2.0f * percent20;
1879 victim->setAttackTimer(BASE_ATTACK, uint32(basetime));
1880 }
1881 }
1882 }
1883
1884 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1885 {
1886 if (!canTakeMeleeDamage() || (!damageInfo->damages[i].damage && !damageInfo->damages[i].absorb && !damageInfo->damages[i].resist))
1887 {
1888 continue;
1889 }
1890
1891 // Call default DealDamage
1892 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->damages[i].absorb, damageInfo->attackType, damageInfo->hitOutCome);
1893 Unit::DealDamage(this, victim, damageInfo->damages[i].damage, &cleanDamage, DIRECT_DAMAGE, SpellSchoolMask(damageInfo->damages[i].damageSchoolMask), nullptr, durabilityLoss);
1894 }
1895
1896 // gain rage if attack is fully blocked, dodged or parried
1898 {
1899 switch (damageInfo->attackType)
1900 {
1901 case BASE_ATTACK:
1902 case OFF_ATTACK:
1903 {
1904 uint32 weaponSpeedHitFactor = uint32(GetAttackTime(damageInfo->attackType) / 1000.0f * (damageInfo->attackType == BASE_ATTACK ? 3.5f : 1.75f));
1905 RewardRage(damageInfo->cleanDamage, weaponSpeedHitFactor, true);
1906 break;
1907 }
1908 default:
1909 break;
1910 }
1911 }
1912
1913 // If this is a creature and it attacks from behind it has a probability to daze it's victim
1914 if ((damageInfo->damages[0].damage + damageInfo->damages[1].damage) && ((damageInfo->hitOutCome == MELEE_HIT_CRIT || damageInfo->hitOutCome == MELEE_HIT_CRUSHING || damageInfo->hitOutCome == MELEE_HIT_NORMAL || damageInfo->hitOutCome == MELEE_HIT_GLANCING) &&
1915 !IsPlayer() && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this)
1916 && (victim->IsPlayer() || !victim->ToCreature()->isWorldBoss()) && !victim->IsVehicle()))
1917 {
1918 // -probability is between 0% and 40%
1919 // 20% base chance
1920 float Probability = 20.0f;
1921
1922 // there is a newbie protection, at level 10 just 7% base chance; assuming linear function
1923 if (victim->GetLevel() < 30)
1924 Probability = 0.65f * victim->GetLevel() + 0.5f;
1925
1926 uint32 VictimDefense = victim->GetDefenseSkillValue();
1927 uint32 AttackerMeleeSkill = GetUnitMeleeSkill();
1928
1929 // xinef: fix daze mechanics
1930 Probability -= ((float)VictimDefense - AttackerMeleeSkill) * 0.1428f;
1931
1932 if (Probability > 40.0f)
1933 Probability = 40.0f;
1934
1935 // Daze application
1936 if (sWorld->getBoolConfig(CONFIG_ENABLE_DAZE))
1937 if (roll_chance_f(std::max(0.0f, Probability)))
1938 CastSpell(victim, 1604, true);
1939 }
1940
1941 if (IsPlayer())
1942 ToPlayer()->CastItemCombatSpell(victim, damageInfo->attackType, damageInfo->procVictim, damageInfo->procEx);
1943
1944 // Do effect if any damage done to target
1945 if (damageInfo->damages[0].damage + damageInfo->damages[1].damage)
1946 {
1947 // We're going to call functions which can modify content of the list during iteration over it's elements
1948 // Let's copy the list so we can prevent iterator invalidation
1950 for (AuraEffectList::const_iterator dmgShieldItr = vDamageShieldsCopy.begin(); dmgShieldItr != vDamageShieldsCopy.end(); ++dmgShieldItr)
1951 {
1952 SpellInfo const* i_spellProto = (*dmgShieldItr)->GetSpellInfo();
1953 // Damage shield can be resisted...
1954 if (SpellMissInfo missInfo = victim->SpellHitResult(this, i_spellProto, false))
1955 {
1956 victim->SendSpellMiss(this, i_spellProto->Id, missInfo);
1957 continue;
1958 }
1959
1960 // ...or immuned
1961 if (IsImmunedToDamageOrSchool(i_spellProto))
1962 {
1963 victim->SendSpellDamageImmune(this, i_spellProto->Id);
1964 continue;
1965 }
1966
1967 uint32 damage = uint32(std::max(0, (*dmgShieldItr)->GetAmount())); // xinef: done calculated at amount calculation
1968
1969 if (Unit* caster = (*dmgShieldItr)->GetCaster())
1970 {
1971 damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE, (*dmgShieldItr)->GetEffIndex());
1972 damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE);
1973 }
1974
1975 uint32 absorb = 0;
1976
1977 DamageInfo dmgInfo(victim, this, damage, i_spellProto, i_spellProto->GetSchoolMask(), SPELL_DIRECT_DAMAGE);
1978 Unit::CalcAbsorbResist(dmgInfo);
1979 absorb = dmgInfo.GetAbsorb();
1980 damage = dmgInfo.GetDamage();
1981
1982 Unit::DealDamageMods(this, damage, &absorb);
1983
1985 WorldPacket data(SMSG_SPELLDAMAGESHIELD, (8 + 8 + 4 + 4 + 4 + 4));
1986 data << victim->GetGUID();
1987 data << GetGUID();
1988 data << uint32(i_spellProto->Id);
1989 data << uint32(damage); // Damage
1990 int32 overkill = int32(damage) - int32(GetHealth());
1991 data << uint32(overkill > 0 ? overkill : 0); // Overkill
1992 data << uint32(i_spellProto->GetSchoolMask());
1993 victim->SendMessageToSet(&data, true);
1994
1995 Unit::DealDamage(victim, this, damage, 0, SPELL_DIRECT_DAMAGE, i_spellProto->GetSchoolMask(), i_spellProto, true);
1996 }
1997 }
1998}
@ CONFIG_ENABLE_DAZE
Definition: IWorld.h:185
@ CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN
Definition: CreatureData.h:49
@ EMOTE_ONESHOT_WOUND_CRITICAL
Definition: SharedDefines.h:1924
@ EMOTE_ONESHOT_PARRY_SHIELD
Definition: SharedDefines.h:1930
SpellMissInfo
Definition: SharedDefines.h:1518
@ SMSG_SPELLDAMAGESHIELD
Definition: Opcodes.h:621
bool isWorldBoss() const
Definition: Creature.h:123
bool HasFlagsExtra(uint32 flag) const
Definition: CreatureData.h:284
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition: Position.cpp:140
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition: Player.cpp:7199
uint32 GetUnitMeleeSkill(Unit const *target=nullptr) const
Definition: Unit.h:1097
void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo)
Definition: Unit.cpp:6445
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition: Unit.cpp:3625
void SendSpellDamageImmune(Unit *target, uint32 spellId)
Definition: Unit.cpp:6469
SpellMissInfo SpellHitResult(Unit *victim, SpellInfo const *spell, bool canReflect=false)
Definition: Unit.cpp:3470
uint32 SpellDamageBonusTaken(Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
Definition: Unit.cpp:11777
void HandleEmoteCommand(uint32 emoteId)
Definition: Unit.cpp:2000
SpellSchoolMask GetSchoolMask() const
Definition: SpellInfo.cpp:1986

References CalcDamageInfo::absorb, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcAbsorbResist(), Player::CastItemCombatSpell(), CastSpell(), CalcDamageInfo::cleanDamage, CONFIG_ENABLE_DAZE, CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DealDamage(), DealDamageMods(), DIRECT_DAMAGE, EMOTE_ONESHOT_PARRY_SHIELD, EMOTE_ONESHOT_WOUND_CRITICAL, DamageInfo::GetAbsorb(), GetAttackTime(), getAttackTimer(), GetAuraEffectsByType(), Creature::GetCreatureTemplate(), DamageInfo::GetDamage(), GetDefenseSkillValue(), Object::GetGUID(), GetHealth(), GetLevel(), SpellInfo::GetSchoolMask(), GetUnitMeleeSkill(), HandleEmoteCommand(), HasActivePowerType(), CreatureTemplate::HasFlagsExtra(), Position::HasInArc(), HasOffhandWeaponForAttack(), HasUnitState(), CalcDamageInfo::HitInfo, HITINFO_CRITICALHIT, CalcDamageInfo::hitOutCome, SpellInfo::Id, IsAlive(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), IsVehicle(), Creature::isWorldBoss(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_GLANCING, MELEE_HIT_NORMAL, OFF_ATTACK, POWER_RAGE, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::resist, RewardRage(), roll_chance_f(), WorldObject::SendMessageToSet(), SendSpellDamageImmune(), SendSpellMiss(), setAttackTimer(), SMSG_SPELLDAMAGESHIELD, SPELL_AURA_DAMAGE_SHIELD, SPELL_DIRECT_DAMAGE, SpellDamageBonusTaken(), SpellHitResult(), sWorld, CalcDamageInfo::target, CalcDamageInfo::TargetState, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_IN_FLIGHT, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ DealSpellDamage()

void Unit::DealSpellDamage ( SpellNonMeleeDamage damageInfo,
bool  durabilityLoss,
Spell const *  spell = nullptr 
)
1439{
1440 if (damageInfo == 0)
1441 return;
1442
1443 Unit* victim = damageInfo->target;
1444
1445 if (!victim)
1446 return;
1447
1448 if (!victim->IsAlive() || victim->IsInFlight() || (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks()))
1449 return;
1450
1451 SpellInfo const* spellProto = damageInfo->spellInfo;
1452 if (!spellProto)
1453 {
1454 LOG_DEBUG("entities.unit", "Unit::DealSpellDamage has wrong damageInfo");
1455 return;
1456 }
1457
1458 // Call default DealDamage
1459 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL);
1460 Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell);
1461}
SpellInfo const * spellInfo
Definition: Unit.h:497
bool IsInFlight() const
Definition: Unit.h:1108

References SpellNonMeleeDamage::absorb, BASE_ATTACK, SpellNonMeleeDamage::cleanDamage, SpellNonMeleeDamage::damage, DealDamage(), IsAlive(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsInFlight(), LOG_DEBUG, MELEE_HIT_NORMAL, SpellNonMeleeDamage::schoolMask, SPELL_DIRECT_DAMAGE, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, and Object::ToCreature().

Referenced by Spell::DoAllEffectOnTarget(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ DelayOwnedAuras()

void Unit::DelayOwnedAuras ( uint32  spellId,
ObjectGuid  caster,
int32  delaytime 
)
5463{
5464 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5465 for (; range.first != range.second; ++range.first)
5466 {
5467 Aura* aura = range.first->second;
5468 if (!caster || aura->GetCasterGUID() == caster)
5469 {
5470 if (aura->GetDuration() < delaytime)
5471 aura->SetDuration(0);
5472 else
5473 aura->SetDuration(aura->GetDuration() - delaytime);
5474
5475 // update for out of range group members (on 1 slot use)
5477 LOG_DEBUG("spells.aura", "Aura {} partially interrupted on unit {}, new duration: {} ms", aura->GetId(), GetGUID().ToString(), aura->GetDuration());
5478 }
5479 }
5480}
std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
Definition: Unit.h:637
int32 GetDuration() const
Definition: SpellAuras.h:133
void SetNeedClientUpdateForTargets() const
Definition: SpellAuras.cpp:1258
void SetDuration(int32 duration, bool withMods=false)
Definition: SpellAuras.cpp:868

References Aura::GetCasterGUID(), Aura::GetDuration(), Object::GetGUID(), Aura::GetId(), LOG_DEBUG, m_ownedAuras, Aura::SetDuration(), Aura::SetNeedClientUpdateForTargets(), and Position::ToString().

◆ DeleteCharmInfo()

void Unit::DeleteCharmInfo ( )
15807{
15808 if (!m_charmInfo)
15809 return;
15810
15812 delete m_charmInfo;
15813 m_charmInfo = nullptr;
15814}
void RestoreState()
Definition: CharmInfo.cpp:46

References m_charmInfo, and CharmInfo::RestoreState().

Referenced by RemoveCharmedBy().

◆ DeMorph()

void Unit::DeMorph ( )
4350{
4352}
virtual void SetDisplayId(uint32 modelId, float displayScale=1.f)
Definition: Unit.cpp:16749
uint32 GetNativeDisplayId() const
Definition: Unit.h:1523

References GetNativeDisplayId(), and SetDisplayId().

Referenced by modify_commandscript::HandleMorphResetCommand().

◆ DisableRotate()

void Unit::DisableRotate ( bool  apply)
18263{
18264 if (!IsCreature())
18265 return;
18266
18267 if (apply)
18271}
@ UNIT_STATE_POSSESSED
Definition: UnitDefines.h:165
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition: Unit.h:683

References HasUnitState(), Object::IsCreature(), RemoveUnitFlag(), SetUnitFlag(), UNIT_FLAG_POSSESSED, and UNIT_STATE_POSSESSED.

Referenced by boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_anub_arak::boss_anub_arakAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::Reset(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ DisableSpline()

◆ Dismount()

void Unit::Dismount ( )
13511{
13512 if (!IsMounted())
13513 return;
13514
13517
13518 if (Player* thisPlayer = ToPlayer())
13519 {
13520 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13521 data << GetPackGUID();
13522 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13523 data << thisPlayer->GetCollisionHeight();
13524 thisPlayer->GetSession()->SendPacket(&data);
13525 }
13526
13527 WorldPacket data(SMSG_DISMOUNT, 8);
13528 data << GetPackGUID();
13529 SendMessageToSet(&data, true);
13530
13531 // dismount as a vehicle
13532 if (IsPlayer() && GetVehicleKit())
13533 {
13534 // Send other players that we are no longer a vehicle
13535 data.Initialize(SMSG_PLAYER_VEHICLE_DATA, 8 + 4);
13536 data << GetPackGUID();
13537 data << uint32(0);
13538 ToPlayer()->SendMessageToSet(&data, true);
13539 // Remove vehicle from player
13541 }
13542
13544
13545 // only resummon old pet if the player is already added to a map
13546 // this prevents adding a pet to a not created map which would otherwise cause a crash
13547 // (it could probably happen when logging in after a previous crash)
13548 if (Player* player = ToPlayer())
13549 {
13550 sScriptMgr->AnticheatSetUnderACKmount(player);
13551
13552 if (Pet* pPet = player->GetPet())
13553 {
13554 if (pPet->HasUnitFlag(UNIT_FLAG_STUNNED) && !pPet->HasUnitState(UNIT_STATE_STUNNED))
13555 pPet->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13556 }
13557 else
13558 player->ResummonPetTemporaryUnSummonedIfAny();
13559
13560 // xinef: if we have charmed npc, remove stun also
13561 if (Unit* charm = player->GetCharm())
13562 if (charm->IsCreature() && !charm->HasUnitState(UNIT_STATE_STUNNED))
13563 charm->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13564 }
13565}
@ AURA_INTERRUPT_FLAG_NOT_MOUNTED
Definition: SpellDefines.h:49
@ UNIT_FLAG_STUNNED
Definition: UnitDefines.h:247
@ UNIT_FLAG_MOUNT
Definition: UnitDefines.h:256
@ UNIT_FIELD_MOUNTDISPLAYID
Definition: UpdateFields.h:126
@ SMSG_PLAYER_VEHICLE_DATA
Definition: Opcodes.h:1221
@ SMSG_MOVE_SET_COLLISION_HGT
Definition: Opcodes.h:1332
@ SMSG_DISMOUNT
Definition: Opcodes.h:970
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition: Player.cpp:5656
void RemoveVehicleKit()
Definition: Unit.cpp:18714

References AURA_INTERRUPT_FLAG_NOT_MOUNTED, GetCharm(), GameTime::GetGameTime(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), IsMounted(), Object::IsPlayer(), RemoveAurasWithInterruptFlags(), RemoveUnitFlag(), RemoveVehicleKit(), WorldObject::SendMessageToSet(), Player::SendMessageToSet(), SetUInt32Value(), SMSG_DISMOUNT, SMSG_MOVE_SET_COLLISION_HGT, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, UNIT_FLAG_STUNNED, and UNIT_STATE_STUNNED.

Referenced by _EnterVehicle(), Player::CleanupAfterTaxiFlight(), FlightPathMovementGenerator::DoFinalize(), BattlegroundWS::EventPlayerClickedOnFlag(), AuraEffect::HandleAuraMounted(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), npc_scarlet_courier::npc_scarlet_courierAI::JustEngagedWith(), boss_mandokir::boss_mandokirAI::JustEngagedWith(), boss_captain_skarloc::MovementInform(), spell_chapter5_light_of_dawn_aura::spell_chapter5_light_of_dawn_aura_AuraScript::OnApply(), Creature::setDeathState(), SetInCombatState(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), npc_magister_aledis::StartFight(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), and npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached().

◆ EnergizeBySpell()

void Unit::EnergizeBySpell ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11258{
11259 int32 gainedPower = victim->ModifyPower(powerType, damage, false);
11260
11261 if (powerType != POWER_HAPPINESS && gainedPower)
11262 {
11263 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);
11264 victim->getHostileRefMgr().threatAssist(this, float(gainedPower) * 0.5f, spellInfo);
11265 }
11266
11267 SendEnergizeSpellLog(victim, spellID, damage, powerType);
11268}
@ POWER_HAPPINESS
Definition: SharedDefines.h:273
void threatAssist(Unit *victim, float baseThreat, SpellInfo const *threatSpell=nullptr)
Definition: HostileRefMgr.cpp:35
void SendEnergizeSpellLog(Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
Definition: Unit.cpp:11246

References getHostileRefMgr(), ModifyPower(), POWER_HAPPINESS, SendEnergizeSpellLog(), sSpellMgr, and HostileRefMgr::threatAssist().

Referenced by Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerDrain(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ EnterVehicle()

void Unit::EnterVehicle ( Unit base,
int8  seatId = -1 
)
19627{
19629
19630 if (Player* player = ToPlayer())
19631 {
19632 sScriptMgr->AnticheatSetUnderACKmount(player);
19633 }
19634}
@ TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE
Will ignore caster aura states including combat requirements and death state.
Definition: SpellDefines.h:143
@ VEHICLE_SPELL_RIDE_HARDCODED
Definition: VehicleDefines.h:52

References CastCustomSpell(), SPELLVALUE_BASE_POINT0, sScriptMgr, Object::ToPlayer(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, and VEHICLE_SPELL_RIDE_HARDCODED.

Referenced by debug_commandscript::HandleDebugEnterVehicleCommand(), WorldSession::HandleEnterPlayerVehicle(), boss_mimiron::boss_mimironAI::JustEngagedWith(), npc_pilgrims_bounty_chair::UpdateAI(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ EnterVehicleUnattackable()

void Unit::EnterVehicleUnattackable ( Unit base,
int8  seatId = -1 
)

◆ ExecuteDelayedUnitAINotifyEvent()

void Unit::ExecuteDelayedUnitAINotifyEvent ( )
20498{
20500 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20501 return;
20502
20503 Acore::AIRelocationNotifier notifier(*this);
20504 float radius = 60.0f;
20505 Cell::VisitAllObjects(this, notifier, radius);
20506}
@ NOTIFY_AI_RELOCATION
Definition: Object.h:66
void RemoveFromNotify(uint16 f)
Definition: Object.h:567
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:206
Definition: GridNotifiers.h:91

References IsDuringRemoveFromWorld(), Object::IsInWorld(), NOTIFY_AI_RELOCATION, WorldObject::RemoveFromNotify(), and Cell::VisitAllObjects().

Referenced by Update().

◆ ExecuteDelayedUnitRelocationEvent()

void Unit::ExecuteDelayedUnitRelocationEvent ( )
20391{
20393 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20394 return;
20395
20396 if (this->HasSharedVision())
20397 for (SharedVisionList::const_iterator itr = this->GetSharedVisionList().begin(); itr != this->GetSharedVisionList().end(); ++itr)
20398 if (Player* player = (*itr))
20399 {
20400 if (player->IsOnVehicle(this) || !player->IsInWorld() || player->IsDuringRemoveFromWorld()) // players on vehicles have their own event executed (due to passenger relocation)
20401 continue;
20402 WorldObject* viewPoint = player;
20403 if (player->m_seer && player->m_seer->IsInWorld())
20404 viewPoint = player->m_seer;
20405 if (!viewPoint->IsPositionValid() || !player->IsPositionValid())
20406 continue;
20407
20408 if (Unit* active = viewPoint->ToUnit())
20409 {
20410 //if (active->IsVehicle()) // always check original unit here, last notify position is not relocated
20411 // active = player;
20412
20413 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20414 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20415 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20416 float distsq = dx * dx + dy * dy + dz * dz;
20417 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20418 if (distsq < mindistsq)
20419 continue;
20420
20421 // this will be relocated below sharedvision!
20422 //active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20423 }
20424
20425 Acore::PlayerRelocationNotifier relocateNoLarge(*player, false); // visit only objects which are not large; default distance
20426 Cell::VisitAllObjects(viewPoint, relocateNoLarge, player->GetSightRange() + VISIBILITY_INC_FOR_GOBJECTS);
20427 relocateNoLarge.SendToSelf();
20428 Acore::PlayerRelocationNotifier relocateLarge(*player, true); // visit only large objects; maximum distance
20429 Cell::VisitAllObjects(viewPoint, relocateLarge, MAX_VISIBILITY_DISTANCE);
20430 relocateLarge.SendToSelf();
20431 }
20432
20433 if (Player* player = this->ToPlayer())
20434 {
20435 WorldObject* viewPoint = player;
20436 if (player->m_seer && player->m_seer->IsInWorld())
20437 viewPoint = player->m_seer;
20438
20439 if (viewPoint->GetMapId() != player->GetMapId() || !viewPoint->IsPositionValid() || !player->IsPositionValid())
20440 return;
20441
20442 if (Unit* active = viewPoint->ToUnit())
20443 {
20444 if (active->IsVehicle())
20445 active = player;
20446
20447 if (!player->GetFarSightDistance())
20448 {
20449 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20450 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20451 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20452 float distsq = dx * dx + dy * dy + dz * dz;
20453
20454 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20455 if (distsq < mindistsq)
20456 return;
20457
20458 active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20459 }
20460 }
20461
20462 Acore::PlayerRelocationNotifier relocateNoLarge(*player, false); // visit only objects which are not large; default distance
20463 Cell::VisitAllObjects(viewPoint, relocateNoLarge, player->GetSightRange() + VISIBILITY_INC_FOR_GOBJECTS);
20464 relocateNoLarge.SendToSelf();
20465
20466 if (!player->GetFarSightDistance())
20467 {
20468 Acore::PlayerRelocationNotifier relocateLarge(*player, true); // visit only large objects; maximum distance
20469 Cell::VisitAllObjects(viewPoint, relocateLarge, MAX_VISIBILITY_DISTANCE);
20470 relocateLarge.SendToSelf();
20471 }
20472
20474 }
20475 else if (Creature* unit = this->ToCreature())
20476 {
20477 if (!unit->IsPositionValid())
20478 return;
20479
20480 float dx = unit->m_last_notify_position.GetPositionX() - unit->GetPositionX();
20481 float dy = unit->m_last_notify_position.GetPositionY() - unit->GetPositionY();
20482 float dz = unit->m_last_notify_position.GetPositionZ() - unit->GetPositionZ();
20483 float distsq = dx * dx + dy * dy + dz * dz;
20484 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(unit->FindMap()->GetEntry()->map_type);
20485 if (distsq < mindistsq)
20486 return;
20487
20488 unit->m_last_notify_position.Relocate(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ());
20489
20490 Acore::CreatureRelocationNotifier relocate(*unit);
20491 Cell::VisitAllObjects(unit, relocate, unit->GetVisibilityRange() + VISIBILITY_COMPENSATION);
20492
20494 }
20495}
#define MAX_VISIBILITY_DISTANCE
Definition: ObjectDefines.h:31
#define VISIBILITY_INC_FOR_GOBJECTS
Definition: ObjectDefines.h:28
#define VISIBILITY_COMPENSATION
Definition: ObjectDefines.h:26
@ NOTIFY_VISIBILITY_CHANGED
Definition: Object.h:67
Unit * ToUnit()
Definition: Object.h:206
void AddToNotify(uint16 f)
Definition: Object.cpp:2978
bool IsPositionValid() const
Definition: Position.cpp:175
uint32 GetMapId() const
Definition: Position.h:276
SharedVisionList const & GetSharedVisionList()
Definition: Unit.h:1296
bool HasSharedVision() const
Definition: Unit.h:1299
Definition: GridNotifiers.h:75
Definition: GridNotifiers.h:83
static float GetReqMoveDistSq(uint32 map_type)
Definition: DynamicVisibility.h:53

References WorldObject::AddToNotify(), WorldLocation::GetMapId(), Position::GetPositionX(), DynamicVisibilityMgr::GetReqMoveDistSq(), GetSharedVisionList(), HasSharedVision(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Position::IsPositionValid(), MAX_VISIBILITY_DISTANCE, NOTIFY_AI_RELOCATION, NOTIFY_VISIBILITY_CHANGED, WorldObject::RemoveFromNotify(), Acore::VisibleNotifier::SendToSelf(), Object::ToCreature(), Object::ToPlayer(), Object::ToUnit(), VISIBILITY_COMPENSATION, VISIBILITY_INC_FOR_GOBJECTS, and Cell::VisitAllObjects().

◆ ExitVehicle()

void Unit::ExitVehicle ( Position const *  exitPosition = nullptr)

This function can be called at upper level code to initialize an exit from the passenger's side.

The following call would not even be executed successfully as the SPELL_AURA_CONTROL_VEHICLE unapply handler already calls _ExitVehicle without specifying an exitposition. The subsequent call below would return on if (!m_vehicle).

To do: We need to allow SPELL_AURA_CONTROL_VEHICLE unapply handlers in spellscripts to specify exit coordinates and either store those per passenger, or we need to init spline movement based on those coordinates in unapply handlers, and relocate exiting passengers based on Unit::moveSpline data. Either way, Coming Soon(TM)

19723{
19725 if (!m_vehicle)
19726 return;
19727
19729 if (Player* player = ToPlayer())
19730 {
19731 player->SetCanTeleport(true);
19732 }
19736 /*_ExitVehicle(exitPosition);*/
19743
19744 if (Player* player = ToPlayer())
19745 {
19746 sScriptMgr->AnticheatSetUnderACKmount(player);
19747 }
19748}
Unit * GetVehicleBase() const
Definition: Unit.cpp:18729

References Object::GetGUID(), GetVehicleBase(), m_vehicle, RemoveAurasByType(), SPELL_AURA_CONTROL_VEHICLE, sScriptMgr, and Object::ToPlayer().

Referenced by _EnterVehicle(), Player::ActivateTaxiPathTo(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), WorldSession::HandleDismissControlledVehicle(), spell_warhead_detonate::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_ulduar_squeezed_lifeless::HandleInstaKill(), WorldSession::HandleRequestVehicleExit(), spell_vehicle_throw_passenger::HandleScript(), boss_kologarn_arms::boss_kologarn_armsAI::JustDied(), Player::ProcessDelayedOperations(), RemoveFromWorld(), Player::StopCastingCharm(), and Player::TeleportTo().

◆ FindCurrentSpellBySpellId()

◆ FinishSpell()

void Unit::FinishSpell ( CurrentSpellTypes  spellType,
bool  ok = true 
)
4088{
4089 Spell* spell = m_currentSpells[spellType];
4090 if (!spell)
4091 return;
4092
4093 if (spellType == CURRENT_CHANNELED_SPELL)
4094 spell->SendChannelUpdate(0);
4095
4096 spell->finish(ok);
4097}
void SendChannelUpdate(uint32 time)
Definition: Spell.cpp:5191

References CURRENT_CHANNELED_SPELL, Spell::finish(), m_currentSpells, and Spell::SendChannelUpdate().

Referenced by AuraEffect::HandleFeignDeath(), AuraEffect::HandleModStealth(), npc_risen_archmage::npc_risen_archmageAI::JustEngagedWith(), boss_lord_marrowgar::UpdateAI(), and GameObject::Use().

◆ GetAffectingPlayer()

Player * Unit::GetAffectingPlayer ( ) const
10617{
10618 if (!GetCharmerOrOwnerGUID())
10619 return const_cast<Unit*>(this)->ToPlayer();
10620
10621 if (Unit* owner = GetCharmerOrOwner())
10623
10624 return nullptr;
10625}
Unit * GetCharmerOrOwner() const
Definition: Unit.h:1255
ObjectGuid GetCharmerOrOwnerGUID() const
Definition: Unit.h:1238

References GetCharmerOrOwner(), GetCharmerOrOwnerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), and Object::ToPlayer().

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), GetFactionReactionTo(), and GetReactionTo().

◆ GetAI()

UnitAI * Unit::GetAI ( )
inline
658{ return i_AI; }

References i_AI.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), spell_algalon_big_bang::CheckTargets(), DealDamage(), DealHeal(), spell_send_mug_target_picker::FilterTargets(), spell_blood_queen_bloodbolt::FilterTargets(), npc_dream_fog::npc_dream_fogAI::GetRandomUnitFromDragonThreatList(), spell_kaelthas_resurrection::HandleBeforeCast(), BattlegroundIC::HandleCapturedNodes(), spell_send_mug_target_picker::HandleDummy(), spell_magtheridon_shadow_grasp_visual::HandleDummyApply(), spell_mount_check_aura::HandleEffectPeriodic(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_random_aggro::HandleOnHit(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_ayamiss_swarmer_start_loop::HandleScript(), spell_pursue::HandleScript(), spell_xt002_gravity_bomb_damage::HandleScript(), spell_the_lich_king_quake::HandleSendEvent(), npc_risen_guardian::npc_risen_guardianAI::IsSummonedBy(), npc_risen_guardian::npc_risen_guardianAI::KilledUnit(), ModifyPower(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), achievement_respect_your_elders::OnCheck(), achievement_hadronox_denied::OnCheck(), achievement_watch_him_die::OnCheck(), achievement_better_off_dred::OnCheck(), achievement_oh_novos::OnCheck(), achievement_share_the_love::OnCheck(), achievement_snakes_whyd_it_have_to_be_snakes::OnCheck(), achievement_im_on_a_boat::OnCheck(), achievement_all_you_can_eat::OnCheck(), achievement_been_waiting_long_time::OnCheck(), achievement_neck_deep_in_vile::OnCheck(), achievement_portal_jockey::OnCheck(), achievement_chaos_theory::OnCheck(), achievement_split_personality::OnCheck(), achievement_algalon_he_feeds_on_your_tears::OnCheck(), achievement_algalon_herald_of_the_titans::OnCheck(), achievement_flame_leviathan_towers::OnCheck(), achievement_flame_leviathan_shutout::OnCheck(), achievement_freya_getting_back_to_nature::OnCheck(), achievement_freya_knock_on_wood::OnCheck(), achievement_yogg_saron_drive_me_crazy::OnCheck(), achievement_yogg_saron_kiss_and_make_up::OnCheck(), achievement_intense_cold::OnCheck(), achievement_once_bitten_twice_shy::OnCheck(), spell_xt002_gravity_bomb_aura::OnPeriodic(), spell_marrowgar_coldflame::SelectTarget(), and boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::SpellHit().

◆ GetAllMinionsByEntry()

void Unit::GetAllMinionsByEntry ( std::list< Creature * > &  Minions,
uint32  entry 
)
10838{
10839 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10840 {
10841 Unit* unit = *itr;
10842 ++itr;
10843 if (unit->GetEntry() == entry && unit->IsCreature()
10844 && unit->ToCreature()->IsSummon()) // minion, actually
10845 Minions.push_back(unit->ToCreature());
10846 }
10847}
bool IsSummon() const
Definition: Unit.h:707

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, and Object::ToCreature().

Referenced by spell_item_gift_of_the_harvester::spell_item_gift_of_the_harvester_SpellScript::CheckRequirement().

◆ GetAPMultiplier()

float Unit::GetAPMultiplier ( WeaponAttackType  attType,
bool  normalized 
)
17206{
17207 if (!normalized || !IsPlayer())
17208 return float(GetAttackTime(attType)) / 1000.0f;
17209
17210 Item* Weapon = ToPlayer()->GetWeaponForAttack(attType, true);
17211 if (!Weapon)
17212 return 2.4f; // fist attack
17213
17214 switch (Weapon->GetTemplate()->InventoryType)
17215 {
17216 case INVTYPE_2HWEAPON:
17217 return 3.3f;
17218 case INVTYPE_RANGED:
17220 case INVTYPE_THROWN:
17221 return 2.8f;
17222 case INVTYPE_WEAPON:
17225 default:
17226 return Weapon->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER ? 1.7f : 2.4f;
17227 }
17228}
Weapon
Definition: boss_arlokk.cpp:76
@ ITEM_SUBCLASS_WEAPON_DAGGER
Definition: ItemTemplate.h:359
@ INVTYPE_RANGED
Definition: ItemTemplate.h:271
@ INVTYPE_THROWN
Definition: ItemTemplate.h:281
@ INVTYPE_RANGEDRIGHT
Definition: ItemTemplate.h:282
@ INVTYPE_WEAPON
Definition: ItemTemplate.h:269
@ INVTYPE_WEAPONMAINHAND
Definition: ItemTemplate.h:277
@ INVTYPE_WEAPONOFFHAND
Definition: ItemTemplate.h:278
@ INVTYPE_2HWEAPON
Definition: ItemTemplate.h:273
Definition: Item.h:220
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition: PlayerStorage.cpp:490

References GetAttackTime(), Player::GetWeaponForAttack(), INVTYPE_2HWEAPON, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_THROWN, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, Object::IsPlayer(), ITEM_SUBCLASS_WEAPON_DAGGER, and Object::ToPlayer().

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and MeleeDamageBonusDone().

◆ GetAppliedAuras() [1/2]

◆ GetAppliedAuras() [2/2]

AuraApplicationMap const & Unit::GetAppliedAuras ( ) const
inline
1332{ return m_appliedAuras; }

References m_appliedAuras.

◆ GetArmor()

◆ getAttackerForHelper()

Unit * Unit::getAttackerForHelper ( ) const
741{
742 if (GetVictim() != nullptr)
743 return GetVictim();
744
745 if (!IsEngaged())
746 return nullptr;
747
748 if (!m_attackers.empty())
749 return *(m_attackers.begin());
750
751 return nullptr;
752}
bool IsEngaged() const
Definition: Unit.h:817
Unit * GetVictim() const
Definition: Unit.h:789

References GetVictim(), IsEngaged(), and m_attackers.

Referenced by Creature::_IsTargetAcceptable(), Creature::CanStartAttack(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), PetAI::SelectNextTarget(), Creature::SelectVictim(), SetControlled(), TotemAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), and PetAI::UpdateAI().

◆ getAttackers()

◆ GetAttackTime()

◆ getAttackTimer()

◆ GetAura()

Aura * Unit::GetAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5582{
5583 AuraApplication* aurApp = GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask);
5584 return aurApp ? aurApp->GetBase() : nullptr;
5585}
AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition: Unit.cpp:5562

References GetAuraApplication(), and AuraApplication::GetBase().

Referenced by Player::_addSpell(), Pet::addSpell(), spell_mage_burning_determination::CheckProc(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_freya::boss_freyaAI::DoAction(), Spell::DoTriggersOnSpellHit(), Spell::EffectScriptEffect(), Spell::EffectTitanGrip(), Spell::EffectWeaponDmg(), getOrphanGUID(), spell_dk_scourge_strike::HandleAfterHit(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleAuraStacksCommand(), deserter_commandscript::HandleDeserterAdd(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_charge_shield_bomber::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), HandleDummyAuraProc(), spell_yogg_saron_sanity_well_aura::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_sindragosa_frost_breath::HandleInfusion(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_putricide_unstable_experiment::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_pal_seal_of_vengeance::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), npc_spiritual_insight::npc_spiritual_insightAI::IsSummonedBy(), npc_gunship::npc_gunshipAI::JustDied(), boss_high_nethermancer_zerevor::JustEngagedWith(), npc_brew_bubble::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), spell_summoning_rhyme_aura::PeriodicTick(), Player::ProcessDelayedOperations(), BattlefieldWG::PromotePlayer(), RemoveAurasDueToSpellBySteal(), Player::ResurrectPlayer(), SetAuraStack(), boss_anomalus::boss_anomalusAI::SetData(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_pilgrims_bounty_chair::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), boss_sindragosa::boss_sindragosaAI::SpellHitTarget(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::SpellHitTarget(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::SpellHitTarget(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ GetAuraApplication()

AuraApplication * Unit::GetAuraApplication ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5563{
5564 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5565 for (; range.first != range.second; ++range.first)
5566 {
5567 AuraApplication* app = range.first->second;
5568 Aura const* aura = app->GetBase();
5569
5570 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
5571 && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5572 && (!itemCasterGUID || aura->GetCastItemGUID() == itemCasterGUID)
5573 && (!except || except != app))
5574 {
5575 return app;
5576 }
5577 }
5578 return nullptr;
5579}
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition: Unit.h:640
uint8 GetEffectMask() const
Definition: SpellAuras.h:176
ObjectGuid GetCastItemGUID() const
Definition: SpellAuras.h:103

References AuraApplication::GetBase(), Aura::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetEffectMask(), and m_appliedAuras.

Referenced by AuraApplication::_Remove(), GetAura(), GetAuraApplicationOfRankedSpell(), HasAura(), and Spell::UpdateChanneledTargetList().

◆ GetAuraApplicationOfRankedSpell()

AuraApplication * Unit::GetAuraApplicationOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5588{
5589 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5590 while (rankSpell)
5591 {
5592 if (AuraApplication* aurApp = GetAuraApplication(rankSpell, casterGUID, itemCasterGUID, reqEffMask, except))
5593 return aurApp;
5594 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5595 }
5596 return nullptr;
5597}

References GetAuraApplication(), and sSpellMgr.

Referenced by spell_warl_drain_soul::CheckProc(), and GetAuraOfRankedSpell().

◆ GetAuraCount()

uint32 Unit::GetAuraCount ( uint32  spellId) const
5683{
5684 uint32 count = 0;
5685 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5686
5687 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5688 {
5689 if (itr->second->GetBase()->GetStackAmount() == 0)
5690 ++count;
5691 else
5692 count += (uint32)itr->second->GetBase()->GetStackAmount();
5693 }
5694
5695 return count;
5696}

References m_appliedAuras.

Referenced by npc_brew_bubble::MoveInLineOfSight(), spell_valithria_suppression_aura::OnApply(), achievement_consumption_junction::OnCheck(), achievement_assembly_of_iron::OnCheck(), achievement_cant_do_that_while_stunned::OnCheck(), spell_valithria_suppression_aura::OnRemove(), SmartScript::ProcessEvent(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), spell_black_temple_spell_absorption_aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ GetAuraEffect() [1/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5535{
5536 AuraEffectList const& auras = GetAuraEffectsByType(type);
5537 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5538 {
5539 SpellInfo const* spell = (*i)->GetSpellInfo();
5540 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5541 {
5542 if (casterGUID && (*i)->GetCasterGUID() != casterGUID)
5543 continue;
5544 return (*i);
5545 }
5546 }
5547 return nullptr;
5548}
bool HasFlag(uint32 p1=0, uint32 p2=0, uint32 p3=0) const
Definition: Util.h:468
flag96 SpellFamilyFlags
Definition: SpellInfo.h:388
uint32 SpellFamilyName
Definition: SpellInfo.h:387

References GetAuraEffectsByType(), flag96::HasFlag(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

◆ GetAuraEffect() [2/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  name,
uint32  iconId,
uint8  effIndex 
) const
5521{
5522 AuraEffectList const& auras = GetAuraEffectsByType(type);
5523 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5524 {
5525 if (effIndex != (*itr)->GetEffIndex())
5526 continue;
5527 SpellInfo const* spell = (*itr)->GetSpellInfo();
5528 if (spell->SpellIconID == iconId && spell->SpellFamilyName == name)
5529 return *itr;
5530 }
5531 return nullptr;
5532}
uint32 SpellIconID
Definition: SpellInfo.h:380

References GetAuraEffectsByType(), SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

◆ GetAuraEffect() [3/3]

AuraEffect * Unit::GetAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5495{
5496 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5497 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5498 {
5499 if (itr->second->HasEffect(effIndex)
5500 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5501 {
5502 return itr->second->GetBase()->GetEffect(effIndex);
5503 }
5504 }
5505 return nullptr;
5506}

References m_appliedAuras.

Referenced by CalculateSpellAmount(), Spell::CanAutoCast(), spell_mage_ice_barrier::CheckCast(), spell_pri_power_word_shield::CheckCast(), spell_mage_molten_armor::CheckProc(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectWeaponDmg(), spell_dru_t10_restoration_4p_bonus::FilterTargets(), GetAuraEffectOfRankedSpell(), GetDummyAuraEffect(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_dk_raise_ally::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_warr_execute::HandleEffect(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pri_divine_aegis::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleShapeshiftBoosts(), spell_warl_drain_soul::HandleTick(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), Guardian::InitStatsForLevel(), npc_anzu_spirit::IsSummonedBy(), MeleeDamageBonusDone(), ModSpellDuration(), spell_dk_death_and_decay::RecalculateDamage(), RemoveAurasDueToSpellByDispel(), SpellDamageBonusDone(), SpellHealingBonusTaken(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), and npc_hallows_end_train_fire::UpdateAI().

◆ GetAuraEffectDummy()

AuraEffect * Unit::GetAuraEffectDummy ( uint32  spellid) const
5551{
5553 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5554 {
5555 if ((*itr)->GetId() == spellid)
5556 return *itr;
5557 }
5558
5559 return nullptr;
5560}
@ SPELL_AURA_DUMMY
Definition: SpellAuraDefines.h:67

References GetAuraEffectsByType(), and SPELL_AURA_DUMMY.

Referenced by Spell::EffectWeaponDmg(), Aura::HandleAuraSpecificMods(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), Guardian::InitStatsForLevel(), Kill(), spell_dk_death_and_decay::RecalculateDamage(), Player::RemoveSpellMods(), and SpellHealingBonusTaken().

◆ GetAuraEffectOfRankedSpell()

AuraEffect * Unit::GetAuraEffectOfRankedSpell ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5509{
5510 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5511 while (rankSpell)
5512 {
5513 if (AuraEffect* aurEff = GetAuraEffect(rankSpell, effIndex, caster))
5514 return aurEff;
5515 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5516 }
5517 return nullptr;
5518}
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition: Unit.cpp:5494

References GetAuraEffect(), and sSpellMgr.

Referenced by spell_mage_fire_frost_ward::Absorb(), spell_sha_earthbind_totem::Apply(), spell_sha_earthliving_weapon::CheckProc(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), SpellPctDamageModsDone(), and spell_mage_incanters_absorbtion_base_AuraScript::Trigger().

◆ GetAuraEffectsByType()

AuraEffectList const & Unit::GetAuraEffectsByType ( AuraType  type) const
inline
1374{ return m_modAuras[type]; }

References m_modAuras.

Referenced by Player::_ApplyWeaponDependentAuraMods(), Spell::_cast(), AuraApplication::_HandleEffect(), KillRewarder::_RewardXP(), CalcAbsorbResist(), CalcArmorReducedDamage(), CalcHealAbsorb(), AuraEffect::CalculateAmount(), Player::CalculateQuestRewardXP(), Spell::CheckCast(), Spell::CheckCasterAuras(), DealDamage(), DealMeleeDamage(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), spell_dk_wandering_plague::FilterTargets(), GetAuraEffect(), GetAuraEffectDummy(), GetDoTsByCaster(), GetMagicHitRedirectTarget(), GetMaxNegativeAuraModifier(), GetMaxNegativeAuraModifierByAffectMask(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifier(), GetMaxPositiveAuraModifierByAffectMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscValue(), Player::getMaxTimer(), GetMeleeHitRedirectTarget(), GetPhaseByAuras(), Player::GetResurrectionSpellId(), Player::GetRuneBaseCooldown(), GetTotalAuraModifier(), GetTotalAuraModifierAreaExclusive(), GetTotalAuraModifierByAffectMask(), GetTotalAuraModifierByMiscMask(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByAffectMask(), GetTotalAuraMultiplierByMiscMask(), GetTotalAuraMultiplierByMiscValue(), GetUnitCriticalChance(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), AuraEffect::HandleAuraTransform(), AuraEffect::HandleDetectAmore(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), HandleDummyAuraProc(), Spell::HandleLaunchPhase(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMirrorImageDataRequest(), AuraEffect::HandleModInvisibility(), modify_commandscript::HandleMorphMountCommand(), AuraEffect::HandleNoReagentUseAura(), spell_illidari_council_judgement::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), HasAuraState(), HasAuraTypeWithAffectMask(), HasAuraTypeWithCaster(), HasAuraTypeWithFamilyFlags(), HasAuraTypeWithMiscvalue(), HasAuraTypeWithTriggerSpell(), HasAuraTypeWithValue(), HasBreakableByDamageAuraType(), HasVisibleAuraType(), IsImmunedToSpellEffect(), IsScriptOverriden(), SpellInfo::IsStrongerAuraActive(), Player::isTotalImmune(), list_commandscript::ListAurasCommand(), MeleeDamageBonusDone(), MeleeDamageBonusTaken(), MeleeSpellHitResult(), Spell::PrepareTriggersExecutedOnHit(), processDummyAuras(), spell_dru_enrage::RecalculateBaseArmor(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::Respawn(), RestoreDisplayId(), Spell::SelectImplicitAreaTargets(), Spell::SelectImplicitConeTargets(), PetAI::SelectNextTarget(), Creature::SelectVictim(), Player::SendInitialPacketsAfterAddToMap(), SetControlled(), Player::SetEntryPoint(), Player::SetSkill(), SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SpellBaseHealingBonusDone(), SpellBaseHealingBonusTaken(), SpellDamageBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), SpellHealingBonusTaken(), SpellHitResult(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), Player::SummonPet(), Player::TeleportTo(), SimpleCharmedAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), Player::UpdateArmor(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCharmedAI(), Player::UpdateExpertise(), Player::UpdateManaRegen(), Player::UpdateRating(), Player::UpdateResistances(), UpdateSpeed(), and Player::UpdateStats().

◆ GetAuraOfRankedSpell()

Aura * Unit::GetAuraOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5600{
5601 AuraApplication* aurApp = GetAuraApplicationOfRankedSpell(spellId, casterGUID, itemCasterGUID, reqEffMask);
5602 return aurApp ? aurApp->GetBase() : nullptr;
5603}
AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition: Unit.cpp:5587

References GetAuraApplicationOfRankedSpell(), and AuraApplication::GetBase().

Referenced by Aura::HandleAuraSpecificMods().

◆ GetCastingTimeForBonus()

uint32 Unit::GetCastingTimeForBonus ( SpellInfo const *  spellProto,
DamageEffectType  damagetype,
uint32  CastingTime 
) const
17066{
17067 // Not apply this to creature casted spells with casttime == 0
17068 if (CastingTime == 0 && IsCreature() && !IsPet())
17069 return 3500;
17070
17071 if (CastingTime > 7000) CastingTime = 7000;
17072 if (CastingTime < 1500) CastingTime = 1500;
17073
17074 if (damagetype == DOT && !spellProto->IsChanneled())
17075 CastingTime = 3500;
17076
17077 int32 overTime = 0;
17078 uint8 effects = 0;
17079 bool DirectDamage = false;
17080 bool AreaEffect = false;
17081
17082 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; i++)
17083 {
17084 switch (spellProto->Effects[i].Effect)
17085 {
17091 case SPELL_EFFECT_HEAL:
17092 DirectDamage = true;
17093 break;
17095 switch (spellProto->Effects[i].ApplyAuraName)
17096 {
17100 if (spellProto->GetDuration())
17101 overTime = spellProto->GetDuration();
17102 break;
17103 default:
17104 // -5% per additional effect
17105 ++effects;
17106 break;
17107 }
17108 default:
17109 break;
17110 }
17111
17112 if (spellProto->Effects[i].IsTargetingArea())
17113 AreaEffect = true;
17114 }
17115
17116 // Combined Spells with Both Over Time and Direct Damage
17117 if (overTime > 0 && DirectDamage)
17118 {
17119 // mainly for DoTs which are 3500 here otherwise
17120 uint32 OriginalCastTime = spellProto->CalcCastTime();
17121 if (OriginalCastTime > 7000) OriginalCastTime = 7000;
17122 if (OriginalCastTime < 1500) OriginalCastTime = 1500;
17123 // Portion to Over Time
17124 float PtOT = (overTime / 15000.0f) / ((overTime / 15000.0f) + (OriginalCastTime / 3500.0f));
17125
17126 if (damagetype == DOT)
17127 CastingTime = uint32(CastingTime * PtOT);
17128 else if (PtOT < 1.0f)
17129 CastingTime = uint32(CastingTime * (1 - PtOT));
17130 else
17131 CastingTime = 0;
17132 }
17133
17134 // Area Effect Spells receive only half of bonus
17135 if (AreaEffect)
17136 CastingTime /= 2;
17137
17138 // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing
17139 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
17140 {
17141 if (spellProto->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH ||
17142 (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH))
17143 {
17144 CastingTime /= 2;
17145 break;
17146 }
17147 }
17148
17149 // -5% of total per any additional effect
17150 for (uint8 i = 0; i < effects; ++i)
17151 CastingTime *= 0.95f;
17152
17153 return CastingTime;
17154}
@ SPELL_AURA_PERIODIC_DAMAGE
Definition: SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_HEAL
Definition: SpellAuraDefines.h:71
@ SPELL_AURA_PERIODIC_LEECH
Definition: SpellAuraDefines.h:116
@ SPELL_EFFECT_POWER_BURN
Definition: SharedDefines.h:840
@ SPELL_EFFECT_HEALTH_LEECH
Definition: SharedDefines.h:787
@ SPELL_EFFECT_HEAL
Definition: SharedDefines.h:788
@ SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
Definition: SharedDefines.h:785
@ SPELL_EFFECT_POWER_DRAIN
Definition: SharedDefines.h:786
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition: SharedDefines.h:780
@ SPELL_EFFECT_APPLY_AURA
Definition: SharedDefines.h:784

References SpellInfo::CalcCastTime(), DOT, SpellInfo::Effects, SpellInfo::GetDuration(), SpellInfo::IsChanneled(), Object::IsCreature(), IsPet(), MAX_SPELL_EFFECTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_EFFECT_APPLY_AURA, SPELL_EFFECT_ENVIRONMENTAL_DAMAGE, SPELL_EFFECT_HEAL, SPELL_EFFECT_HEALTH_LEECH, SPELL_EFFECT_POWER_BURN, SPELL_EFFECT_POWER_DRAIN, and SPELL_EFFECT_SCHOOL_DAMAGE.

Referenced by CalculateDefaultCoefficient().

◆ GetCharm()

Unit * Unit::GetCharm ( ) const
10658{
10659 if (ObjectGuid charm_guid = GetCharmGUID())
10660 {
10661 if (Unit* pet = ObjectAccessor::GetUnit(*this, charm_guid))
10662 return pet;
10663
10664 LOG_ERROR("entities.unit", "Unit::GetCharm: Charmed creature {} not exist.", charm_guid.ToString());
10666 }
10667
10668 return nullptr;
10669}
@ UNIT_FIELD_CHARM
Definition: UpdateFields.h:86
Unit * GetUnit(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:199
void SetGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:723
ObjectGuid GetCharmGUID() const
Definition: Unit.h:1230

References ObjectGuid::Empty, GetCharmGUID(), ObjectAccessor::GetUnit(), LOG_ERROR, Object::SetGuidValue(), and UNIT_FIELD_CHARM.

Referenced by Spell::_cast(), AddPetAura(), spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Dismount(), Spell::finish(), GetFirstControlled(), spell_warl_eye_of_kilrogg::HandleAuraApply(), spell_warl_eye_of_kilrogg::HandleAuraRemove(), spell_dk_raise_ally::HandleDummy(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), WorldSession::HandleRequestPetInfo(), isPossessing(), Mount(), Player::PossessSpellInitialize(), RemovePetAura(), Spell::SelectImplicitCasterObjectTargets(), SetSpeed(), npc_pilgrims_bounty_chair::SpellHitTarget(), and Player::StopCastingCharm().

◆ GetCharmer()

◆ GetCharmerGUID()

◆ GetCharmerOrOwner()

◆ GetCharmerOrOwnerGUID()

◆ GetCharmerOrOwnerOrOwnGUID()

◆ GetCharmerOrOwnerOrSelf()

Unit * Unit::GetCharmerOrOwnerOrSelf ( ) const
inline
1257 {
1258 if (Unit* u = GetCharmerOrOwner())
1259 return u;
1260
1261 return (Unit*)this;
1262 }

References GetCharmerOrOwner().

Referenced by CombatStart(), CombatStartOnCast(), GetPartyMembers(), GetReactionTo(), IsInPartyWith(), IsInRaidWith(), SetInCombatWith(), and TotemAI::UpdateAI().

◆ GetCharmerOrOwnerPlayerOrPlayerItself()

Player * Unit::GetCharmerOrOwnerPlayerOrPlayerItself ( ) const
10608{
10610 if (guid.IsPlayer())
10611 return ObjectAccessor::GetPlayer(*this, guid);
10612
10613 return const_cast<Unit*>(this)->ToPlayer();
10614}
Player * GetPlayer(Map const *, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:220

References GetCharmerOrOwnerGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), and Object::ToPlayer().

Referenced by Spell::_handle_finish_phase(), spell_sha_earthbind_totem::Apply(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), BuildValuesUpdate(), spell_q12237_rescue_villager::CheckCast(), spell_q12237_drop_off_villager::CheckCast(), CombatStart(), CombatStartOnCast(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), DealDamage(), Spell::EffectGameObjectSetDestructionState(), Spell::EffectKillCredit(), Spell::EffectKillCreditPersonal(), Spell::EffectSummonPet(), GetAffectingPlayer(), Object::GetUpdateFieldData(), spell_gen_charmed_unit_spell_cooldown::HandleCast(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_q12851_going_bearback::HandleEffectApply(), spell_q12726_song_of_wind_and_water::HandleHealPct(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_q10769_dissension_amongst_the_ranks::HandleScriptEffect(), npc_pet_gen_valkyr_guardian::InitializeAI(), isTargetableForAttack(), GuardAI::JustDied(), boss_kurinnaxx::JustDied(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustDied(), npc_darnavan::npc_darnavanAI::JustDied(), npc_four_car_garage::npc_four_car_garageAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), Kill(), Condition::Meets(), GameObject::ModifyHealth(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), SmartScript::ProcessAction(), ProcessTerrainStatusUpdate(), Pet::RemoveSpellCooldown(), Spell::SendSpellCooldown(), SetCharm(), SetContestedPvP(), SetInCombatState(), Creature::SetLootRecipient(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::SpellHit(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), and Creature::UpdateEntry().

◆ GetCharmGUID()

◆ GetCharmInfo()

◆ getClass()

uint8 Unit::getClass ( ) const
inline
747{ return GetByteValue(UNIT_FIELD_BYTES_0, 1); }
@ UNIT_FIELD_BYTES_0
Definition: UpdateFields.h:95
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition: Object.cpp:323

References Object::GetByteValue(), and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), ArenaTeam::AddMember(), SpellEffectInfo::CalcValue(), getClassMask(), GetDebugInfo(), Player::GetDodgeFromAgility(), SocialMgr::GetFriendInfo(), Player::GetMeleeCritFromAgility(), Player::GetMissPercentageFromDefence(), Player::GetPlayerName(), Player::GetRatingMultiplier(), Player::GetSpec(), Player::GetSpellCritFromIntellect(), Player::GetStartPosition(), Player::GiveLevel(), spell_item_flask_of_the_north::HandleDummy(), HandleDummyAuraProc(), learn_commandscript::HandleLearnAllMySpellsCommand(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), HandleProcTriggerSpell(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDataForForm(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Player::IsClass(), IsClass(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), ClassCallSelector::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), Player::RewardHonor(), Guild::Member::SetStats(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Player::StoreNewItemInBestSlots(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UpdateAI(), Player::UpdateDodgePercentage(), Player::UpdateParryPercentage(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getClassMask()

◆ GetCollisionHeight()

float Unit::GetCollisionHeight ( ) const
overridevirtual

Return collision height sent to client.

Reimplemented from WorldObject.

21094{
21095 float scaleMod = GetObjectScale(); // 99% sure about this
21096 float defaultHeight = DEFAULT_COLLISION_HEIGHT * scaleMod;
21097
21098 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
21099 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
21100 float collisionHeight = 0.0f;
21101
21102 if (IsMounted())
21103 {
21105 {
21106 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
21107 {
21108 collisionHeight = scaleMod * (mountModelData->MountHeight + modelData->CollisionHeight * modelData->Scale * displayInfo->scale * 0.5f);
21109 }
21110 }
21111 }
21112 else
21113 collisionHeight = scaleMod * modelData->CollisionHeight * modelData->Scale * displayInfo->scale;
21114
21115 return collisionHeight == 0.0f ? defaultHeight : collisionHeight;
21116}
DBCStorage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore(CreatureDisplayInfofmt)
DBCStorage< CreatureModelDataEntry > sCreatureModelDataStore(CreatureModelDatafmt)
#define DEFAULT_COLLISION_HEIGHT
Definition: ObjectDefines.h:50
float GetObjectScale() const
Definition: Object.h:115
Definition: DBCStructure.h:720
uint32 ModelId
Definition: DBCStructure.h:722
float scale
Definition: DBCStructure.h:725
Definition: DBCStructure.h:774
float Scale
Definition: DBCStructure.h:778
float CollisionHeight
Definition: DBCStructure.h:789

References CreatureModelDataEntry::CollisionHeight, DEFAULT_COLLISION_HEIGHT, GetNativeDisplayId(), Object::GetObjectScale(), Object::GetUInt32Value(), IsMounted(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by DynObjAura::FillTargetMap(), WorldObject::GetNearPoint(), GetRandomContactPoint(), WorldSession::HandleMovementOpcodes(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Spell::SelectImplicitCasterDestTargets(), spell_spawn_blood_pool::SetDest(), WorldObject::UpdateAllowedPositionZ(), and Creature::UpdateMovementFlags().

◆ GetCollisionRadius()

float Unit::GetCollisionRadius ( ) const
overridevirtual

this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the radius also takes in consideration the mount size

Returns
float The radius of a unit

Reimplemented from WorldObject.

21088{
21089 return GetCollisionWidth() / 2;
21090}
float GetCollisionWidth() const override
this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by...
Definition: Unit.cpp:21050

References GetCollisionWidth().

Referenced by GetMeleeAttackPoint(), and Creature::Update().

◆ GetCollisionWidth()

float Unit::GetCollisionWidth ( ) const
overridevirtual

this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the diameter also takes in consideration the mount size

Returns
float The diameter of a unit

Dismounting case - use basic default model data

Reimplemented from WorldObject.

21051{
21052 if (IsPlayer())
21053 return GetObjectSize();
21054
21055 float scaleMod = GetObjectScale(); // 99% sure about this
21056 float objectSize = GetObjectSize();
21057 float defaultSize = DEFAULT_WORLD_OBJECT_SIZE * scaleMod;
21058
21060 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
21061 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
21062
21063 if (IsMounted())
21064 {
21066 {
21067 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
21068 {
21069 if (G3D::fuzzyGt(mountModelData->CollisionWidth, modelData->CollisionWidth))
21070 modelData = mountModelData;
21071 }
21072 }
21073 }
21074
21075 float collisionWidth = scaleMod * modelData->CollisionWidth * modelData->Scale * displayInfo->scale * 2;
21076 // if the objectSize is the default value or the creature is mounted and we have a DBC value, then we can retrieve DBC value instead
21077 return G3D::fuzzyGt(collisionWidth, 0.0f) && (G3D::fuzzyEq(objectSize,defaultSize) || IsMounted()) ? collisionWidth : objectSize;
21078}
#define DEFAULT_WORLD_OBJECT_SIZE
Definition: ObjectDefines.h:45
float GetObjectSize() const
Definition: Object.cpp:2771
float CollisionWidth
Definition: DBCStructure.h:788

References CreatureModelDataEntry::CollisionWidth, DEFAULT_WORLD_OBJECT_SIZE, GetNativeDisplayId(), Object::GetObjectScale(), WorldObject::GetObjectSize(), Object::GetUInt32Value(), IsMounted(), Object::IsPlayer(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by GetCollisionRadius().

◆ GetCombatRatingDamageReduction()

uint32 Unit::GetCombatRatingDamageReduction ( CombatRating  cr,
float  rate,
float  cap,
uint32  damage 
) const
private
19182{
19183 float percent = std::min(GetCombatRatingReduction(cr) * rate, cap);
19184 return CalculatePct(damage, percent);
19185}
float GetCombatRatingReduction(CombatRating cr) const
Definition: Unit.cpp:19169

References CalculatePct(), and GetCombatRatingReduction().

Referenced by GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritDamageReduction(), and GetSpellDamageReduction().

◆ GetCombatRatingReduction()

float Unit::GetCombatRatingReduction ( CombatRating  cr) const
private
19170{
19171 if (Player const* player = ToPlayer())
19172 return player->GetRatingBonusValue(cr);
19173 // Player's pet get resilience from owner
19174 else if (IsPet() && GetOwner())
19175 if (Player* owner = GetOwner()->ToPlayer())
19176 return owner->GetRatingBonusValue(cr);
19177
19178 return 0.0f;
19179}

References GetOwner(), IsPet(), and Object::ToPlayer().

Referenced by GetCombatRatingDamageReduction(), GetMeleeCritChanceReduction(), GetRangedCritChanceReduction(), and GetSpellCritChanceReduction().

◆ GetCombatReach()

◆ GetCombatTimer()

uint32 Unit::GetCombatTimer ( ) const
inline
830{ return m_CombatTimer; }

References m_CombatTimer.

Referenced by Spell::DoSpellHitOnUnit(), and SetInCombatState().

◆ GetComboPoints() [1/2]

uint8 Unit::GetComboPoints ( ObjectGuid const &  guid) const
inline
1644{ return (m_comboTarget && m_comboTarget->GetGUID() == guid) ? m_comboPoints : 0; }

References Object::GetGUID(), m_comboPoints, and m_comboTarget.

◆ GetComboPoints() [2/2]

uint8 Unit::GetComboPoints ( Unit const *  who = nullptr) const
inline

--------—Combo point system----------------—

1643{ return (who && m_comboTarget != who) ? 0 : m_comboPoints; }

References m_comboPoints, and m_comboTarget.

Referenced by CalcSpellDuration(), SpellEffectInfo::CalcValue(), Spell::CheckCast(), and Spell::EffectSchoolDMG().

◆ GetComboTarget()

Unit * Unit::GetComboTarget ( ) const
inline
1645{ return m_comboTarget; }

References m_comboTarget.

Referenced by Player::DuelComplete(), and HandleProcTriggerSpell().

◆ GetComboTargetGUID()

ObjectGuid const Unit::GetComboTargetGUID ( ) const
inline

◆ GetCreateHealth()

◆ GetCreateMana()

◆ GetCreatePowers()

uint32 Unit::GetCreatePowers ( Powers  power) const
15647{
15648 // Only hunter pets have POWER_FOCUS and POWER_HAPPINESS
15649 switch (power)
15650 {
15651 case POWER_MANA:
15652 return GetCreateMana();
15653 case POWER_RAGE:
15654 return 1000;
15655 case POWER_FOCUS:
15656 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 100);
15657 case POWER_ENERGY:
15658 return 100;
15659 case POWER_HAPPINESS:
15660 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 1050000);
15661 case POWER_RUNIC_POWER:
15662 return 1000;
15663 case POWER_RUNE:
15664 return 0;
15665 case POWER_HEALTH:
15666 return 0;
15667 default:
15668 break;
15669 }
15670
15671 return 0;
15672}
@ POWER_HEALTH
Definition: SharedDefines.h:278
@ POWER_RUNIC_POWER
Definition: SharedDefines.h:275
@ POWER_ENERGY
Definition: SharedDefines.h:272
@ POWER_RUNE
Definition: SharedDefines.h:274
@ POWER_FOCUS
Definition: SharedDefines.h:271
uint32 GetCreateMana() const
Definition: Unit.h:1448

References GetCreateMana(), HUNTER_PET, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_HEALTH, POWER_MANA, POWER_RAGE, POWER_RUNE, and POWER_RUNIC_POWER.

Referenced by Pet::CreateBaseAtTamed(), HandleDummyAuraProc(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), setPowerType(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ GetCreateStat()

float Unit::GetCreateStat ( Stats  stat) const
inline

◆ GetCreatorGUID()

ObjectGuid Unit::GetCreatorGUID ( ) const
inline
@ UNIT_FIELD_CREATEDBY
Definition: UpdateFields.h:91

References Object::GetGuidValue(), and UNIT_FIELD_CREATEDBY.

Referenced by Condition::Meets().

◆ GetCreatureType()

uint32 Unit::GetCreatureType ( ) const
15169{
15170 if (IsPlayer())
15171 {
15173 SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
15174 if (ssEntry && ssEntry->creatureType > 0)
15175 return ssEntry->creatureType;
15176 else
15178 }
15179 else
15180 return ToCreature()->GetCreatureTemplate()->type;
15181}
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormEntryfmt)
ShapeshiftForm
Definition: UnitDefines.h:68
@ CREATURE_TYPE_HUMANOID
Definition: SharedDefines.h:2634
uint32 type
Definition: CreatureData.h:223
ShapeshiftForm GetShapeshiftForm() const
Definition: Unit.h:1475
Definition: DBCStructure.h:1816
int32 creatureType
Definition: DBCStructure.h:1822

References CREATURE_TYPE_HUMANOID, SpellShapeshiftFormEntry::creatureType, Creature::GetCreatureTemplate(), GetShapeshiftForm(), Object::IsPlayer(), sSpellShapeshiftFormStore, Object::ToCreature(), and CreatureTemplate::type.

Referenced by Creature::CanStartAttack(), spell_utgarde_pinnacle_beast_mark::CheckProc(), Spell::EffectKnockBack(), spell_dk_death_pact::FilterTargets(), GetCreatureTypeMask(), GetUnitParryChance(), AuraEffect::HandleAuraEmpathy(), spell_dru_starfall_dummy::HandleDummy(), IsCritter(), CreatureAI::MoveInLineOfSight(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnUnitDeath(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), SetInCombatState(), and Creature::UpdateMoveInLineOfSightState().

◆ GetCreatureTypeMask()

uint32 Unit::GetCreatureTypeMask ( ) const
inline
977 {
978 uint32 creatureType = GetCreatureType();
979 return (creatureType >= 1) ? (1 << (creatureType - 1)) : 0;
980 }
uint32 GetCreatureType() const
Definition: Unit.cpp:15168

References GetCreatureType().

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), SpellInfo::CheckTargetCreatureType(), MeleeDamageBonusDone(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ GetCritterGUID()

ObjectGuid Unit::GetCritterGUID ( ) const
inline

◆ GetCurrentSpell() [1/2]

◆ GetCurrentSpell() [2/2]

Spell * Unit::GetCurrentSpell ( uint32  spellType) const
inline
1469{ return m_currentSpells[spellType]; }

References m_currentSpells.

◆ GetCurrentSpellCastTime()

int32 Unit::GetCurrentSpellCastTime ( uint32  spell_id) const
4153{
4154 if (Spell const* spell = FindCurrentSpellBySpellId(spell_id))
4155 return spell->GetCastTime();
4156 return 0;
4157}
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition: Unit.cpp:4144

References FindCurrentSpellBySpellId().

Referenced by CasterAI::JustEngagedWith(), CasterAI::UpdateAI(), and boss_mandokir::boss_mandokirAI::UpdateAI().

◆ getDeathState()

◆ GetDebugInfo()

std::string Unit::GetDebugInfo ( ) const
overridevirtual

Reimplemented from WorldObject.

21318{
21319 std::stringstream sstr;
21320 sstr << WorldObject::GetDebugInfo() << "\n"
21321 << std::boolalpha
21322 << "AliveState: " << IsAlive()
21323 << " UnitMovementFlags: " << GetUnitMovementFlags() << " ExtraUnitMovementFlags: " << GetExtraUnitMovementFlags()
21324 << " Class: " << std::to_string(getClass());
21325 return sstr.str();
21326}
std::string GetDebugInfo() const override
Definition: Object.cpp:2484

References getClass(), WorldObject::GetDebugInfo(), GetExtraUnitMovementFlags(), GetUnitMovementFlags(), and IsAlive().

Referenced by UnitAI::GetDebugInfo(), Creature::GetDebugInfo(), and Player::GetDebugInfo().

◆ GetDefaultMovementType()

MovementGeneratorType Unit::GetDefaultMovementType ( ) const
virtual

-------—End of Pet responses methods-------—

Reimplemented in Creature.

16633{
16634 return IDLE_MOTION_TYPE;
16635}
@ IDLE_MOTION_TYPE
Definition: MotionMaster.h:37

References IDLE_MOTION_TYPE.

◆ GetDefenseSkillValue()

uint32 Unit::GetDefenseSkillValue ( Unit const *  target = nullptr) const
3626{
3627 if (IsPlayer())
3628 {
3629 // in PvP use full skill instead current skill value
3630 uint32 value = (target && target->IsPlayer())
3633 value += uint32(ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
3634 return value;
3635 }
3636 else
3637 return GetUnitMeleeSkill(target);
3638}
@ CR_DEFENSE_SKILL
Definition: Unit.h:218
@ SKILL_DEFENSE
Definition: SharedDefines.h:2881
uint16 GetSkillValue(uint32 skill) const
Definition: Player.cpp:5437
uint16 GetMaxSkillValue(uint32 skill) const
Definition: Player.cpp:5454

References CR_DEFENSE_SKILL, Player::GetMaxSkillValue(), Player::GetSkillValue(), GetUnitMeleeSkill(), Object::IsPlayer(), SKILL_DEFENSE, and Object::ToPlayer().

Referenced by spell_pal_ardent_defender::Absorb(), DealMeleeDamage(), GetUnitCriticalChance(), RollMeleeOutcomeAgainst(), SpellTakenCritChance(), Player::UpdateBlockPercentage(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetDiminishing()

DiminishingLevels Unit::GetDiminishing ( DiminishingGroup  group)
14994{
14995 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
14996 {
14997 if (i->DRGroup != group)
14998 continue;
14999
15000 if (!i->hitCount)
15001 return DIMINISHING_LEVEL_1;
15002
15003 if (!i->hitTime)
15004 return DIMINISHING_LEVEL_1;
15005
15006 // If last spell was casted more than 15 seconds ago - reset the count.
15007 if (i->stack == 0 && getMSTimeDiff(i->hitTime, GameTime::GetGameTimeMS().count()) > 15000)
15008 {
15009 i->hitCount = DIMINISHING_LEVEL_1;
15010 return DIMINISHING_LEVEL_1;
15011 }
15012 // or else increase the count.
15013 else
15014 return DiminishingLevels(i->hitCount);
15015 }
15016 return DIMINISHING_LEVEL_1;
15017}
uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
Definition: Timer.h:110

References DIMINISHING_LEVEL_1, GameTime::GetGameTimeMS(), getMSTimeDiff(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ GetDirectTransport()

TransportBase * Unit::GetDirectTransport ( ) const

Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)

18755{
18756 if (Vehicle* veh = GetVehicle())
18757 return veh;
18758 return GetTransport();
18759}
Vehicle * GetVehicle() const
Definition: Unit.h:1687

References WorldObject::GetTransport(), and GetVehicle().

Referenced by Movement::TransportPathTransform::operator()(), SmartScript::ProcessAction(), CharmInfo::SaveStayPosition(), WaypointMovementGenerator< Creature >::StartMove(), and UpdateSplinePosition().

◆ GetDiseasesByCaster()

uint32 Unit::GetDiseasesByCaster ( ObjectGuid  casterGUID,
uint8  mode = 0 
)
5822{
5823 static const AuraType diseaseAuraTypes[] =
5824 {
5825 SPELL_AURA_PERIODIC_DAMAGE, // Frost Fever and Blood Plague
5826 SPELL_AURA_LINKED, // Crypt Fever and Ebon Plague
5828 };
5829
5830 ObjectGuid drwGUID;
5831
5832 if (Player* playerCaster = ObjectAccessor::GetPlayer(*this, casterGUID))
5833 drwGUID = playerCaster->getRuneWeaponGUID();
5834
5835 uint32 diseases = 0;
5836 for (uint8 index = 0; diseaseAuraTypes[index] != SPELL_AURA_NONE; ++index)
5837 {
5838 for (AuraEffectList::iterator i = m_modAuras[diseaseAuraTypes[index]].begin(); i != m_modAuras[diseaseAuraTypes[index]].end();)
5839 {
5840 // Get auras with disease dispel type by caster
5841 if ((*i)->GetSpellInfo()->Dispel == DISPEL_DISEASE
5842 && ((*i)->GetCasterGUID() == casterGUID || (*i)->GetCasterGUID() == drwGUID)) // if its caster or his dancing rune weapon
5843 {
5844 ++diseases;
5845
5846 if (mode == 1)
5847 {
5848 RemoveAura((*i)->GetId(), (*i)->GetCasterGUID());
5849 i = m_modAuras[diseaseAuraTypes[index]].begin();
5850 continue;
5851 }
5852 // used for glyph of scourge strike
5853 else if (mode == 2)
5854 {
5855 Aura* aura = (*i)->GetBase();
5856 if (aura && !aura->IsRemoved() && aura->GetDuration() > 0)
5857 if ((aura->GetApplyTime() + aura->GetMaxDuration() / 1000 + 8) > (GameTime::GetGameTime().count() + aura->GetDuration() / 1000))
5858 aura->SetDuration(aura->GetDuration() + 3000);
5859 }
5860 }
5861 ++i;
5862 }
5863 }
5864 return diseases;
5865}
AuraType
Definition: SpellAuraDefines.h:62
@ SPELL_AURA_LINKED
Definition: SpellAuraDefines.h:347
@ SPELL_AURA_NONE
Definition: SpellAuraDefines.h:63
@ DISPEL_DISEASE
Definition: SharedDefines.h:1375
int32 GetMaxDuration() const
Definition: SpellAuras.h:129
time_t GetApplyTime() const
Definition: SpellAuras.h:128

References DISPEL_DISEASE, Aura::GetApplyTime(), Aura::GetDuration(), GameTime::GetGameTime(), Aura::GetMaxDuration(), ObjectAccessor::GetPlayer(), Aura::IsRemoved(), m_modAuras, RemoveAura(), Aura::SetDuration(), SPELL_AURA_LINKED, SPELL_AURA_NONE, and SPELL_AURA_PERIODIC_DAMAGE.

Referenced by Spell::EffectWeaponDmg(), MeleeDamageBonusDone(), and SpellPctDamageModsDone().

◆ GetDispellableAuraList()

void Unit::GetDispellableAuraList ( Unit caster,
uint32  dispelMask,
DispelChargesList dispelList,
SpellInfo const *  dispelSpell 
)
5606{
5607 // we should not be able to dispel diseases if the target is affected by unholy blight
5608 if (dispelMask & (1 << DISPEL_DISEASE) && HasAura(50536))
5609 dispelMask &= ~(1 << DISPEL_DISEASE);
5610
5611 ReputationRank rank = GetReactionTo(caster, IsCharmed());
5612 bool positive = rank >= REP_FRIENDLY;
5613
5614 // Neutral unit not at war with caster should be treated as a friendly unit
5615 if (rank == REP_NEUTRAL)
5616 {
5617 if (Player* casterPlayer = caster->GetAffectingPlayer())
5618 {
5619 if (FactionTemplateEntry const* factionTemplateEntry = GetFactionTemplateEntry())
5620 {
5621 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
5622 {
5623 if (factionEntry->CanBeSetAtWar())
5624 {
5625 positive = !casterPlayer->GetReputationMgr().IsAtWar(factionEntry);
5626 }
5627 }
5628 }
5629 }
5630 }
5631
5632 Unit::VisibleAuraMap const* visibleAuras = GetVisibleAuras();
5633 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
5634 {
5635 Aura* aura = itr->second->GetBase();
5636
5637 // don't try to remove passive auras
5638 if (aura->IsPassive())
5639 continue;
5640
5641 if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)
5642 {
5643 if (aura->GetSpellInfo()->Dispel == DISPEL_MAGIC)
5644 {
5645 // do not remove positive auras if friendly target
5646 // negative auras if non-friendly target
5647 if (itr->second->IsPositive() == positive)
5648 continue;
5649 }
5650
5651 // Banish should only be dispelled by Mass Dispel
5652 if (aura->GetSpellInfo()->Mechanic == MECHANIC_BANISH && !dispelSpell->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
5653 {
5654 continue;
5655 }
5656
5657 // The charges / stack amounts don't count towards the total number of auras that can be dispelled.
5658 // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell
5659 // Polymorph instead of 1 / (5 + 1) -> 16%.
5660 bool dispel_charges = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_REMOVES_CHARGES);
5661 uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount();
5662 if (charges > 0)
5663 dispelList.push_back(std::make_pair(aura, charges));
5664 }
5665 }
5666}
@ SPELL_ATTR7_DISPEL_REMOVES_CHARGES
Definition: SharedDefines.h:651
@ MECHANIC_BANISH
Definition: SharedDefines.h:1343
@ SPELL_ATTR0_NO_IMMUNITIES
Definition: SharedDefines.h:411
@ REP_FRIENDLY
Definition: SharedDefines.h:184
@ DISPEL_MAGIC
Definition: SharedDefines.h:1373
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5698
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition: Unit.h:652
VisibleAuraMap const * GetVisibleAuras()
Definition: Unit.h:1504
uint8 GetStackAmount() const
Definition: SpellAuras.h:148
uint8 GetCharges() const
Definition: SpellAuras.h:141
bool IsPassive() const
Definition: SpellAuras.cpp:1082
uint32 Mechanic
Definition: SpellInfo.h:323
uint32 Dispel
Definition: SpellInfo.h:322

References SpellInfo::Dispel, DISPEL_DISEASE, DISPEL_MAGIC, GetAffectingPlayer(), Aura::GetCharges(), SpellInfo::GetDispelMask(), GetFactionTemplateEntry(), GetReactionTo(), Aura::GetSpellInfo(), Aura::GetStackAmount(), GetVisibleAuras(), SpellInfo::HasAttribute(), HasAura(), IsCharmed(), Aura::IsPassive(), SpellInfo::Mechanic, MECHANIC_BANISH, REP_FRIENDLY, REP_NEUTRAL, sFactionStore, SPELL_ATTR0_NO_IMMUNITIES, and SPELL_ATTR7_DISPEL_REMOVES_CHARGES.

Referenced by Spell::EffectDispel().

◆ GetDisplayId()

uint32 Unit::GetDisplayId ( ) const
inline

References Object::GetUInt32Value(), and UNIT_FIELD_DISPLAYID.

Referenced by boss_jormungarAI::AttackStart(), WorldSession::BuildPartyMemberStatsChangedPacket(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), Pet::CreateBaseAtCreature(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), boss_jormungarAI::DoAction(), GetDisplayRace(), AuraEffect::HandleAuraCloneCaster(), spell_gen_model_visible::HandleEffectApply(), WorldSession::HandleMirrorImageDataRequest(), npc_commandscript::HandleNpcGuidCommand(), npc_commandscript::HandleNpcInfoCommand(), WorldSession::HandleRequestPartyMemberStatsOpcode(), spell_death_knight_initiate_visual::HandleScriptEffect(), wp_commandscript::HandleWpShowCommand(), Guardian::InitStatsForLevel(), IsInDisallowedMountForm(), boss_tharon_ja::boss_tharon_jaAI::JustDied(), npc_scholomance_occultist::npc_scholomance_occultistAI::JustEngagedWith(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::KilledUnit(), boss_devourer_of_souls::boss_devourer_of_soulsAI::KilledUnit(), achievement_less_rabi::OnCheck(), WretchedGhoulCleaner::operator()(), boss_leotheras_the_blind::Reset(), boss_jormungarAI::ScheduleEvents(), Creature::SetObjectScale(), boss_halion::boss_halionAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), and boss_leotheras_the_blind::UpdateAI().

◆ GetDisplayRace()

DisplayRace Unit::GetDisplayRace ( ) const
inline
DisplayRace GetDisplayRaceFromModelId(uint32 modelId) const
Definition: Unit.cpp:21012
uint32 GetDisplayId() const
Definition: Unit.h:1521

References GetDisplayId(), and GetDisplayRaceFromModelId().

Referenced by AuraEffect::HandleAuraTransform().

◆ GetDisplayRaceFromModelId()

DisplayRace Unit::GetDisplayRaceFromModelId ( uint32  modelId) const
21013{
21014 if (CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(modelId))
21015 {
21016 if (CreatureDisplayInfoExtraEntry const* displayExtra = sCreatureDisplayInfoExtraStore.LookupEntry(display->ExtendedDisplayInfoID))
21017 {
21018 return DisplayRace(displayExtra->DisplayRaceID);
21019 }
21020 }
21021 return DisplayRace::None;
21022}
DBCStorage< CreatureDisplayInfoExtraEntry > sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt)
DisplayRace
Definition: SharedDefines.h:111
Definition: DBCStructure.h:738

References sCreatureDisplayInfoExtraStore, and sCreatureDisplayInfoStore.

Referenced by GetDisplayRace().

◆ GetDoTsByCaster()

uint32 Unit::GetDoTsByCaster ( ObjectGuid  casterGUID) const
5868{
5869 static const AuraType diseaseAuraTypes[] =
5870 {
5874 };
5875
5876 uint32 dots = 0;
5877 for (AuraType const* itr = &diseaseAuraTypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
5878 {
5879 Unit::AuraEffectList const& auras = GetAuraEffectsByType(*itr);
5880 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5881 {
5882 // Get auras by caster
5883 if ((*i)->GetCasterGUID() == casterGUID)
5884 ++dots;
5885 }
5886 }
5887 return dots;
5888}
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
Definition: SpellAuraDefines.h:152

References GetAuraEffectsByType(), SPELL_AURA_NONE, SPELL_AURA_PERIODIC_DAMAGE, and SPELL_AURA_PERIODIC_DAMAGE_PERCENT.

Referenced by SpellPctDamageModsDone().

◆ GetDummyAuraEffect()

◆ GetDynamicFlags()

◆ GetDynObject()

DynamicObject * Unit::GetDynObject ( uint32  spellId)
6129{
6130 if (m_dynObj.empty())
6131 return nullptr;
6132 for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end(); ++i)
6133 {
6134 DynamicObject* dynObj = *i;
6135 if (dynObj->GetSpellId() == spellId)
6136 return dynObj;
6137 }
6138 return nullptr;
6139}
Definition: DynamicObject.h:35
uint32 GetSpellId() const
Definition: DynamicObject.h:58

References DynamicObject::GetSpellId(), and m_dynObj.

Referenced by Spell::DelayedChannel(), and WorldSession::HandleFarSightOpcode().

◆ GetEffectiveResistChance()

float Unit::GetEffectiveResistChance ( Unit const *  owner,
SpellSchoolMask  schoolMask,
Unit const *  victim 
)
static
2114{
2115 float victimResistance = float(victim->GetResistance(schoolMask));
2116 if (owner)
2117 {
2118 // Xinef: pets inherit 100% of masters penetration
2119 // Xinef: excluding traps
2120 Player const* player = owner->GetSpellModOwner();
2121 if (player && owner->GetEntry() != WORLD_TRIGGER)
2122 {
2123 victimResistance += float(player->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2124 victimResistance -= float(player->GetSpellPenetrationItemMod());
2125 }
2126 else
2127 victimResistance += float(owner->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2128 }
2129
2130 victimResistance = std::max(victimResistance, 0.0f);
2131 if (owner)
2132 victimResistance += std::max((float(victim->GetLevel()) - float(owner->GetLevel())) * 5.0f, 0.0f);
2133
2134 static uint32 const BOSS_LEVEL = 83;
2135 static float const BOSS_RESISTANCE_CONSTANT = 510.0f;
2136 uint32 level = victim->GetLevel();
2137 float resistanceConstant = 0.0f;
2138
2139 if (level == BOSS_LEVEL)
2140 resistanceConstant = BOSS_RESISTANCE_CONSTANT;
2141 else
2142 resistanceConstant = level * 5.0f;
2143
2144 return victimResistance / (victimResistance + resistanceConstant);
2145}
int32 GetSpellPenetrationItemMod() const
Definition: Player.h:1954

References Object::GetEntry(), GetLevel(), GetResistance(), GetSpellModOwner(), Player::GetSpellPenetrationItemMod(), GetTotalAuraModifierByMiscMask(), SPELL_AURA_MOD_TARGET_RESISTANCE, and WORLD_TRIGGER.

Referenced by CalcAbsorbResist(), and MagicSpellHitResult().

◆ GetExtraUnitMovementFlags()

uint16 Unit::GetExtraUnitMovementFlags ( ) const
inline

◆ GetFaction()

uint32 Unit::GetFaction ( ) const
inline

References Object::GetUInt32Value(), and UNIT_FIELD_FACTIONTEMPLATE.

Referenced by npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::AttackStart(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::AttackStart(), Creature::CanAssistTo(), spell_q10985_light_of_the_naaru::CheckProc(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), Spell::EffectDuel(), Spell::EffectSummonType(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::EnterEvadeMode(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::EnterEvadeMode(), AuctionListItemsDelayEvent::Execute(), npc_chesspiece::GetDefaultOrientationForTeam(), GetFactionTemplateEntry(), GetReactionTo(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListOwnerItemsEvent(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleGossipHelloOpcode(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcGuidCommand(), npc_commandscript::HandleNpcInfoCommand(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandlePlayerLoginFromDB(), TempSummon::InitStats(), InitTamedPet(), IsFriendly(), IsInPartyWith(), IsInRaidWith(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), npc_escortAI::JustRespawned(), FollowerAI::JustRespawned(), SmartAI::JustRespawned(), boss_volkhan::boss_volkhanAI::JustSummoned(), Pet::LoadPetFromDB(), npc_chesspiece::npc_chesspiece(), npc_plucky::npc_pluckyAI::npc_pluckyAI(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::npc_taskmaster_fizzuleAI(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), npc_eris_hevenfire::OnQuestAccept(), npc_cork_gizelton::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), PatchValuesUpdate(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), WorldSession::SendAuctionHello(), SetCharmedBy(), Player::SetGameMaster(), npc_chesspiece::sGossipHello(), boss_malchezaar::SpawnInfernal(), Spell::SummonGuardian(), Player::SummonPet(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), npc_chesspiece::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), and Creature::UpdateMoveInLineOfSightState().

◆ GetFactionReactionTo()

ReputationRank Unit::GetFactionReactionTo ( FactionTemplateEntry const *  factionTemplateEntry,
Unit const *  target 
) const
10176{
10177 // always neutral when no template entry found
10178 if (!factionTemplateEntry)
10179 return REP_NEUTRAL;
10180
10181 FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry();
10182 if (!targetFactionTemplateEntry)
10183 return REP_NEUTRAL;
10184
10185 // xinef: check forced reputation for self also
10186 if (Player const* selfPlayerOwner = GetAffectingPlayer())
10187 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(target->GetFactionTemplateEntry()))
10188 return *repRank;
10189
10190 if (Player const* targetPlayerOwner = target->GetAffectingPlayer())
10191 {
10192 // check contested flags
10193 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10194 && targetPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10195 return REP_HOSTILE;
10196 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(factionTemplateEntry))
10197 return *repRank;
10198 if (!target->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10199 {
10200 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
10201 {
10202 if (factionEntry->CanHaveReputation())
10203 {
10204 // CvP case - check reputation, don't allow state higher than neutral when at war
10205 ReputationRank repRank = targetPlayerOwner->GetReputationMgr().GetRank(factionEntry);
10206 if (targetPlayerOwner->GetReputationMgr().IsAtWar(factionEntry))
10207 repRank = std::min(REP_NEUTRAL, repRank);
10208 return repRank;
10209 }
10210 }
10211 }
10212 }
10213
10214 // common faction based check
10215 if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry))
10216 return REP_HOSTILE;
10217 if (factionTemplateEntry->IsFriendlyTo(*targetFactionTemplateEntry))
10218 return REP_FRIENDLY;
10219 if (targetFactionTemplateEntry->IsFriendlyTo(*factionTemplateEntry))
10220 return REP_FRIENDLY;
10221 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS)
10222 return REP_HOSTILE;
10223 // neutral by default
10224 return REP_NEUTRAL;
10225}
@ PLAYER_FLAGS_CONTESTED_PVP
Definition: Player.h:482
@ UNIT_FLAG2_IGNORE_REPUTATION
Definition: UnitDefines.h:270
@ FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS
Definition: DBCEnums.h:332
@ FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
Definition: DBCEnums.h:331
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition: DBCStructure.h:950

References FactionTemplateEntry::faction, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS, FactionTemplateEntry::factionFlags, GetAffectingPlayer(), GetFactionTemplateEntry(), HasUnitFlag2(), FactionTemplateEntry::IsFriendlyTo(), FactionTemplateEntry::IsHostileTo(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HOSTILE, REP_NEUTRAL, sFactionStore, and UNIT_FLAG2_IGNORE_REPUTATION.

Referenced by GetReactionTo().

◆ GetFactionTemplateEntry()

FactionTemplateEntry const * Unit::GetFactionTemplateEntry ( ) const
10026{
10027 FactionTemplateEntry const* entry = sFactionTemplateStore.LookupEntry(GetFaction());
10028 if (!entry)
10029 {
10030 static ObjectGuid guid; // prevent repeating spam same faction problem
10031
10032 if (GetGUID() != guid)
10033 {
10034 if (Player const* player = ToPlayer())
10035 LOG_ERROR("entities.unit", "Player {} has invalid faction (faction template id) #{}", player->GetName(), GetFaction());
10036 else if (Creature const* creature = ToCreature())
10037 LOG_ERROR("entities.unit", "Creature (template id: {}) has invalid faction (faction template id) #{}", creature->GetCreatureTemplate()->Entry, GetFaction());
10038 else
10039 LOG_ERROR("entities.unit", "Unit (name={}, type={}) has invalid faction (faction template id) #{}", GetName(), uint32(GetTypeId()), GetFaction());
10040
10041 guid = GetGUID();
10042 }
10043 }
10044 return entry;
10045}
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
TypeID GetTypeId() const
Definition: Object.h:124
std::string const & GetName() const
Definition: Object.h:458
uint32 GetFaction() const
Definition: Unit.h:755

References GetFaction(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), LOG_ERROR, sFactionTemplateStore, Object::ToCreature(), and Object::ToPlayer().

Referenced by _IsValidAttackTarget(), Player::CanUseBattlegroundObject(), HostileRefMgr::deleteReferencesForFaction(), Spell::EffectGameObjectDamage(), GetDispellableAuraList(), GetFactionReactionTo(), GetReactionTo(), Player::GetReputationPriceDiscount(), IsContestedGuard(), IsHostileToPlayers(), IsNeutralToAll(), npc_chesspiece::OnCharmed(), and PatchValuesUpdate().

◆ GetFirstControlled()

Unit * Unit::GetFirstControlled ( ) const
11062{
11063 // Sequence: charmed, pet, other guardians
11064 Unit* unit = GetCharm();
11065 if (!unit)
11066 if (ObjectGuid guid = GetMinionGUID())
11067 unit = ObjectAccessor::GetUnit(*this, guid);
11068
11069 return unit;
11070}
ObjectGuid GetMinionGUID() const
Definition: Unit.h:1226

References GetCharm(), GetMinionGUID(), and ObjectAccessor::GetUnit().

Referenced by Player::CharmSpellInitialize(), CombatStart(), WorldSession::HandlePetSetAction(), and RemoveCharmedBy().

◆ GetFirstMinion()

Minion * Unit::GetFirstMinion ( ) const
10628{
10629 if (ObjectGuid pet_guid = GetMinionGUID())
10630 {
10631 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10632 if (pet->HasUnitTypeMask(UNIT_MASK_MINION))
10633 return (Minion*)pet;
10634
10635 LOG_ERROR("entities.unit", "Unit::GetFirstMinion: Minion {} not exist.", pet_guid.ToString());
10636 const_cast<Unit*>(this)->SetMinionGUID(ObjectGuid::Empty);
10637 }
10638
10639 return nullptr;
10640}
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const)
Definition: ObjectAccessor.cpp:234
void SetMinionGUID(ObjectGuid guid)
Definition: Unit.h:1227

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetMinionGUID(), LOG_ERROR, SetMinionGUID(), and UNIT_MASK_MINION.

◆ GetFollowAngle()

◆ GetGameObject()

GameObject * Unit::GetGameObject ( uint32  spellId) const
6170{
6171 for (GameObjectList::const_iterator itr = m_gameObj.begin(); itr != m_gameObj.end(); ++itr)
6172 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6173 if (go->GetSpellId() == spellId)
6174 return go;
6175
6176 return nullptr;
6177}

References ObjectAccessor::GetGameObject(), and m_gameObj.

Referenced by Player::GetGameObjectIfCanInteractWith(), and Player::TeleportTo().

◆ getGender()

◆ GetGuardianPet()

Guardian * Unit::GetGuardianPet ( ) const
10643{
10644 if (ObjectGuid pet_guid = GetPetGUID())
10645 {
10646 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10647 if (pet->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10648 return (Guardian*)pet;
10649
10650 LOG_FATAL("entities.unit", "Unit::GetGuardianPet: Guardian {} not exist.", pet_guid.ToString());
10651 const_cast<Unit*>(this)->SetPetGUID(ObjectGuid::Empty);
10652 }
10653
10654 return nullptr;
10655}
#define LOG_FATAL(filterType__,...)
Definition: Log.h:152
Definition: TemporarySummon.h:95
void SetPetGUID(ObjectGuid guid)
Definition: Unit.h:1231
ObjectGuid GetPetGUID() const
Definition: Unit.h:1232

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetPetGUID(), LOG_FATAL, SetPetGUID(), and UNIT_MASK_GUARDIAN.

Referenced by spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Spell::EffectSummonPet(), GetNextRandomRaidMemberOrPet(), AuraEffect::HandleAuraDummy(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), AuraEffect::HandleModDamageDone(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), Spell::SelectImplicitCasterObjectTargets(), and SetMinion().

◆ GetHealth()

uint32 Unit::GetHealth ( ) const
inline
@ UNIT_FIELD_HEALTH
Definition: UpdateFields.h:96

References Object::GetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_SaveCharacter(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), Spell::CheckPower(), CountPctFromCurHealth(), boss_eregos::boss_eregosAI::DamageTaken(), boss_gyth::boss_gythAI::DamageTaken(), boss_razorgore::boss_razorgoreAI::DamageTaken(), boss_majordomo::boss_majordomoAI::DamageTaken(), boss_ragnaros::boss_ragnarosAI::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_julianne::DamageTaken(), boss_romulo::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_kiljaeden::boss_kiljaedenAI::DamageTaken(), boss_muru::boss_muruAI::DamageTaken(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::DamageTaken(), boss_halazzi::DamageTaken(), npc_halazzi_lynx::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), npc_amanitar_mushrooms::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_announcer_toc5::npc_announcer_toc5AI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_ick::boss_ickAI::DamageTaken(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::DamageTaken(), boss_drakkari_colossus::boss_drakkari_colossusAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_akama_illidan::DamageTaken(), npc_maiev_illidan::DamageTaken(), boss_illidari_council::DamageTaken(), boss_illidari_council_memberAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_the_lurker_below::DamageTaken(), npc_shattered_hand_scout::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_hor_leader_second::npc_hor_leader_secondAI::DamageTaken(), npc_ice_tomb::npc_ice_tombAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_nightbane::DamageTaken(), boss_thekal::DamageTaken(), boss_illidan_stormrage::DamageTaken(), npc_garr_firesworn::npc_garr_fireswornAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_kalecgos::boss_kalecgosAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), SmartAI::DamageTaken(), boss_sathrovarr::boss_sathrovarrAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kologarn::boss_kologarnAI::DamageTaken(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), DealMeleeDamage(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), boss_zuljin::boss_zuljinAI::DoMeleeAttackIfReady(), Spell::EffectHealMaxHealth(), Spell::EffectInstaKill(), Pet::FillPetInfo(), boss_supremus::FindHatefulStrikeTarget(), GetHealthGain(), GetHealthPct(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_rajaxx_thundercrash::HandleDamageCalc(), misc_commandscript::HandleDieCommand(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), npc_commandscript::HandleNpcInfoCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), boss_akilzon::boss_akilzonAI::HandleStormSequence(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), IsFullHealth(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::JustDied(), npc_dirt_mound::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), Kill(), ModifyHealth(), spell_xt002_gravity_bomb_aura::OnPeriodic(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::ResetPlayerDamageReq(), Player::SaveHealthBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), SendAttackStateUpdate(), SendSpellNonMeleeDamageLog(), SendSpellNonMeleeReflectLog(), SetMaxHealth(), boss_eadric::boss_eadricAI::SpellHit(), boss_headless_horseman_head::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), boss_ouro::Submerge(), Aura::Update(), boss_zuljin::boss_zuljinAI::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), Player::UpdateCharmedAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ GetHealthGain()

int32 Unit::GetHealthGain ( int32  dVal)
14110{
14111 int32 gain = 0;
14112
14113 if (dVal == 0)
14114 return 0;
14115
14116 int32 curHealth = (int32)GetHealth();
14117
14118 int32 val = dVal + curHealth;
14119 if (val <= 0)
14120 {
14121 return -curHealth;
14122 }
14123
14124 int32 maxHealth = (int32)GetMaxHealth();
14125
14126 if (val < maxHealth)
14127 gain = dVal;
14128 else if (curHealth != maxHealth)
14129 gain = maxHealth - curHealth;
14130
14131 return gain;
14132}

References GetHealth(), and GetMaxHealth().

Referenced by Spell::DoAllEffectOnTarget().

◆ GetHealthPct()

◆ getHostileRefMgr()

◆ GetHoverHeight()

float Unit::GetHoverHeight ( ) const
inline

◆ GetInterruptMask()

uint32 Unit::GetInterruptMask ( ) const
inline
1515{ return m_interruptMask; }

References m_interruptMask.

◆ GetLastDamagedTargetGuid()

ObjectGuid const & Unit::GetLastDamagedTargetGuid ( ) const
inline
1021{ return _lastDamagedTargetGuid; }

References _lastDamagedTargetGuid.

◆ GetLastExtraAttackSpell()

uint32 Unit::GetLastExtraAttackSpell ( ) const
inline
1018{ return _lastExtraAttackSpell; }

References _lastExtraAttackSpell.

Referenced by HandleProcTriggerSpell().

◆ GetLevel()

uint8 Unit::GetLevel ( ) const
inline
@ UNIT_FIELD_LEVEL
Definition: UpdateFields.h:114

References Object::GetUInt32Value(), and UNIT_FIELD_LEVEL.

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDamage(), KillRewarder::_InitGroupData(), Pet::_LoadAuras(), KillRewarder::_RewardPlayer(), KillRewarder::_RewardXP(), Player::_SaveCharacter(), Player::_SaveStats(), spell_pal_ardent_defender::Absorb(), Pet::addSpell(), Spell::AddUnitTarget(), Player::ApplyEnchantment(), AuraEffect::AuraEffect(), BattlegroundMgr::BuildBattlegroundListPacket(), WorldSession::BuildPartyMemberStatsChangedPacket(), CalcArmorReducedDamage(), SpellInfo::CalcPowerCost(), SpellEffectInfo::CalcRadius(), spell_gen_disabled_above_63::CalculateAmount(), spell_item_arcane_shroud::CalculateAmount(), spell_item_the_eye_of_diminution::CalculateAmount(), CalculateLevelPenalty(), CalculateMeleeDamage(), Player::CalculateMinMaxDamage(), Player::CalculateQuestRewardXP(), Player::CalculateReputationGain(), Player::CalculateTalentsPoints(), SpellEffectInfo::CalcValue(), Player::CanEquipItem(), Group::CanJoinBattlegroundQueue(), Player::CanSeeStartQuest(), Player::CanUseItem(), Player::CheckAreaExploreAndOutdoor(), spell_hun_tame_beast::CheckCast(), Spell::CheckCast(), Spell::CheckEffectTarget(), spell_gen_proc_above_75::CheckLevel(), spell_gen_proc_reduced_above_60::CheckProc(), spell_item_green_whelp_armor::CheckProc(), Pet::CreateBaseAtTamed(), Player::CreatePet(), CreateTamedPetFrom(), DealMeleeDamage(), DoLowUnlearnCost(), DoMedUnlearnCost(), Spell::DoSpellHitOnUnit(), Spell::EffectAddHonor(), Spell::EffectApplyGlyph(), Spell::EffectDuel(), Spell::EffectEnergize(), Spell::EffectSchoolDMG(), Spell::EffectSkinning(), Spell::EffectTameCreature(), Pet::FillPetInfo(), lfg::LFGMgr::FinishDungeon(), Acore::XP::Gain(), Player::GetAverageItemLevel(), Player::GetAverageItemLevelForDF(), Player::GetBarberShopCost(), Player::GetBGAccessByLevel(), Pet::GetCurrentFoodBenefitLevel(), npc_wg_quest_giver::GetDialogStatus(), Player::GetDodgeFromAgility(), GetEffectiveResistChance(), SocialMgr::GetFriendInfo(), getLevelForTarget(), Creature::getLevelForTarget(), GetMaxSkillValueForLevel(), Player::GetMeleeCritFromAgility(), Pet::GetNativeObjectScale(), Player::GetQuestDialogStatus(), Player::GetQuestLevel(), Player::GetRatingMultiplier(), Creature::GetShieldBlockValue(), Player::GetSpellCritFromIntellect(), Player::GetsRecruitAFriendBonus(), Player::GetTrainerSpellState(), GetUnitMeleeSkill(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), WorldSession::HandleAcceptGrantLevel(), OutdoorPvPSI::HandleAreaTrigger(), WorldSession::HandleArenaTeamInviteOpcode(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlefieldStatusOpcode(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), WorldSession::HandleCastSpellOpcode(), Player::HandleDrowning(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLfgPlayerLockInfoRequestOpcode(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), WorldSession::HandleMessagechatOpcode(), npc_commandscript::HandleNpcInfoCommand(), WorldSession::HandleOfferPetitionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandlePetitionSignOpcode(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), spell_pri_divine_aegis::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), reset_commandscript::HandleResetLevelCommand(), spell_wintergrasp_portal::HandleScript(), spell_item_scroll_of_recall::HandleScript(), WorldSession::HandleSendMail(), player_settings_commandscript::HandleSettingsAnnouncerFlags(), Player::InitGlyphsForLevel(), lfg::LFGMgr::InitializeLockedDungeons(), Pet::InitLevelupSpellsForLevel(), Puppet::InitStats(), TempSummon::InitStats(), Player::InitStatsForLevel(), Pet::InitTalentForLevel(), Player::InitTaxiNodesForLevel(), Battlefield::InvitePlayerToWar(), Creature::isCanTrainingAndResetTalentsOf(), Player::isHonorOrXPTarget(), Player::IsMaxLevel(), Player::LearnDefaultSkill(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), AchievementCriteriaData::Meets(), MeleeSpellHitResult(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), spell_item_with_mount_speed::OnApply(), item_generic_limit_chance_above_60::OnCastItemCombatSpell(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), Player::OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), Player::PrepareGossipMenu(), Player::Regenerate(), Player::RegenerateHealth(), Player::RemovedInsignia(), Pet::removeSpell(), Pet::resetTalents(), Player::ResurrectPlayer(), Player::RewardHonor(), Player::RewardQuest(), RewardRage(), Player::RewardReputation(), RollMeleeOutcomeAgainst(), ArenaTeam::Roster(), Player::Satisfy(), Player::SatisfyQuestLevel(), Pet::SavePetToDB(), CalendarMgr::SendCalendarEvent(), CalendarMgr::SendCalendarEventInvite(), WorldSession::SendLfgPlayerReward(), WorldSession::SendLfgRoleCheckUpdate(), Player::SendLoot(), PlayerMenu::SendQuestGiverOfferReward(), PlayerMenu::SendQuestGiverQuestDetails(), PlayerMenu::SendQuestQueryResponse(), Player::SendQuestReward(), ObjectMgr::SendServerMail(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), Player::SetRestBonus(), Guild::Member::SetStats(), SpellPctDamageModsDone(), Spell::SummonGuardian(), Player::SummonPet(), Pet::SynchronizeLevelWithOwner(), Aura::Update(), npc_pet_hunter_snake_trap::UpdateAI(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCombatSkills(), Creature::UpdateEntry(), lfg::LFGMgr::UpdateRaidBrowser(), and GameObject::Use().

◆ getLevelForTarget()

◆ GetMagicHitRedirectTarget()

Unit * Unit::GetMagicHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo 
)
11006{
11007 // Patch 1.2 notes: Spell Reflection no longer reflects abilities
11008 if (spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR1_NO_REDIRECTION) || spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
11009 return victim;
11010
11012 for (Unit::AuraEffectList::const_iterator itr = magnetAuras.begin(); itr != magnetAuras.end(); ++itr)
11013 {
11014 if (Unit* magnet = (*itr)->GetBase()->GetUnitOwner())
11015 if (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11016 //&& spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK
11017 && _IsValidAttackTarget(magnet, spellInfo)
11018 /*&& IsWithinLOSInMap(magnet)*/)
11019 {
11020 // Xinef: We should choose minimum between flight time and queue time as in reflect, however we dont know flight time at this point, use arbitrary small number
11021 magnet->m_Events.AddEvent(new RedirectSpellEvent(*magnet, victim->GetGUID(), *itr), magnet->m_Events.CalculateQueueTime(100));
11022
11023 if (magnet->IsTotem())
11024 {
11025 uint64 queueTime = magnet->m_Events.CalculateQueueTime(100);
11026 if (spellInfo->Speed > 0.0f)
11027 {
11028 float dist = GetDistance(magnet->GetPositionX(), magnet->GetPositionY(), magnet->GetPositionZ());
11029 if (dist < 5.0f)
11030 dist = 5.0f;
11031 queueTime = magnet->m_Events.CalculateTime((uint64)std::floor(dist / spellInfo->Speed * 1000.0f));
11032 }
11033
11034 magnet->m_Events.AddEvent(new KillMagnetEvent(*magnet), queueTime);
11035 }
11036
11037 return magnet;
11038 }
11039 }
11040 return victim;
11041}
@ SPELL_AURA_SPELL_MAGNET
Definition: SpellAuraDefines.h:159
@ SPELL_ATTR1_NO_REDIRECTION
Definition: SharedDefines.h:422
@ SPELL_ATTR0_IS_ABILITY
Definition: SharedDefines.h:386
Definition: TotemAI.h:47
float GetDistance(WorldObject const *obj) const
Definition: Object.cpp:1245
bool _IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
Definition: Unit.cpp:13863
Definition: Unit.h:2040

References _IsValidAttackTarget(), SpellInfo::CheckExplicitTarget(), GetAuraEffectsByType(), WorldObject::GetDistance(), Object::GetGUID(), SpellInfo::HasAttribute(), SpellInfo::Speed, SPELL_ATTR0_IS_ABILITY, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_NO_REDIRECTION, SPELL_AURA_SPELL_MAGNET, and SPELL_CAST_OK.

Referenced by Spell::SelectExplicitTargets().

◆ GetMaxHealth()

uint32 Unit::GetMaxHealth ( ) const
inline
@ UNIT_FIELD_MAXHEALTH
Definition: UpdateFields.h:104

References Object::GetUInt32Value(), and UNIT_FIELD_MAXHEALTH.

Referenced by Player::_SaveStats(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_viscidus::boss_viscidus(), WorldSession::BuildPartyMemberStatsChangedPacket(), spell_item_skull_of_impeding_doom::CalculateDamageAmount(), CountPctFromMaxHealth(), boss_eregos::boss_eregosAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_twinemperorsAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_heated_battle::npc_heated_battleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectHealMaxHealth(), Spell::EffectSummonPet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), Acore::XP::Gain(), GetHealthGain(), GetHealthPct(), npc_echo_of_medivh::GetPiece(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), HandleAuraProc(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcInfoCommand(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_stinky_precious_decimate::HandleScript(), IsFullHealth(), boss_twin_valkyrAI::JustEngagedWith(), boss_sister_svalna::boss_sister_svalnaAI::JustEngagedWith(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), Player::outDebugValues(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), boss_kalecgos::boss_kalecgosAI::Reset(), boss_halazzi::Reset(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetFullHealth(), SetHealth(), boss_headless_horseman::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), boss_viscidus::SummonedCreatureDies(), boss_headless_horseman::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxNegativeAuraModifier()

int32 Unit::GetMaxNegativeAuraModifier ( AuraType  auratype) const
5950{
5951 int32 modifier = 0;
5952
5953 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5954 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5955 if ((*i)->GetAmount() < modifier)
5956 modifier = (*i)->GetAmount();
5957
5958 return modifier;
5959}

References GetAuraEffectsByType().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), SpellHealingBonusTaken(), and UpdateSpeed().

◆ GetMaxNegativeAuraModifierByAffectMask()

int32 Unit::GetMaxNegativeAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6105{
6106 int32 modifier = 0;
6107
6108 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6109 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6110 {
6111 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() < modifier)
6112 modifier = (*i)->GetAmount();
6113 }
6114
6115 return modifier;
6116}

References GetAuraEffectsByType().

◆ GetMaxNegativeAuraModifierByMiscMask()

int32 Unit::GetMaxNegativeAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6001{
6002 int32 modifier = 0;
6003
6004 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6005 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6006 {
6007 if ((*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() < modifier)
6008 modifier = (*i)->GetAmount();
6009 }
6010
6011 return modifier;
6012}

References GetAuraEffectsByType().

Referenced by SpellTakenCritChance().

◆ GetMaxNegativeAuraModifierByMiscValue()

int32 Unit::GetMaxNegativeAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6053{
6054 int32 modifier = 0;
6055
6056 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6057 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6058 {
6059 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() < modifier)
6060 modifier = (*i)->GetAmount();
6061 }
6062
6063 return modifier;
6064}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult(), and ModSpellDuration().

◆ GetMaxPositiveAuraModifier()

int32 Unit::GetMaxPositiveAuraModifier ( AuraType  auratype)
5936{
5937 int32 modifier = 0;
5938
5939 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5940 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5941 {
5942 if ((*i)->GetAmount() > modifier)
5943 modifier = (*i)->GetAmount();
5944 }
5945
5946 return modifier;
5947}

References GetAuraEffectsByType().

Referenced by CalculateSpellAmount(), AuraEffect::HandlePeriodicHealAurasTick(), Player::RewardHonor(), SpellHealingBonusTaken(), and UpdateSpeed().

◆ GetMaxPositiveAuraModifierByAffectMask()

int32 Unit::GetMaxPositiveAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6091{
6092 int32 modifier = 0;
6093
6094 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6095 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6096 {
6097 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() > modifier)
6098 modifier = (*i)->GetAmount();
6099 }
6100
6101 return modifier;
6102}

References GetAuraEffectsByType().

◆ GetMaxPositiveAuraModifierByMiscMask()

int32 Unit::GetMaxPositiveAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask,
const AuraEffect except = nullptr 
) const
5987{
5988 int32 modifier = 0;
5989
5990 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5991 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5992 {
5993 if (except != (*i) && (*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() > modifier)
5994 modifier = (*i)->GetAmount();
5995 }
5996
5997 return modifier;
5998}

References GetAuraEffectsByType(), and AuraEffect::GetMiscValue().

Referenced by AuraEffect::HandleAuraModResistanceExclusive(), and SpellTakenCritChance().

◆ GetMaxPositiveAuraModifierByMiscValue()

int32 Unit::GetMaxPositiveAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6039{
6040 int32 modifier = 0;
6041
6042 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6043 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6044 {
6045 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() > modifier)
6046 modifier = (*i)->GetAmount();
6047 }
6048
6049 return modifier;
6050}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult().

◆ GetMaxPower()

uint32 Unit::GetMaxPower ( Powers  power) const
inline
892{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power); }
@ UNIT_FIELD_MAXPOWER1
Definition: UpdateFields.h:105

References Object::GetUInt32Value(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::_SaveStats(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_gen_replenishment_aura::CalculateAmount(), spell_item_skull_of_impeding_doom::CalculateManaLeechAmount(), Spell::CheckItems(), Player::Create(), boss_shade_of_aran::DamageTaken(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerBurn(), Spell::EffectResurrect(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), GetPowerPct(), Player::GiveLevel(), HandleAuraProc(), Aura::HandleAuraSpecificMods(), HandleDummyAuraProc(), modify_commandscript::HandleModifyEnergyCommand(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_hun_ascpect_of_the_viper::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_kelthuzad_detonate_mana_aura::HandleScript(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), boss_curator::JustEngagedWith(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), ModifyPowerPct(), boss_shade_of_aran::OnPowerUpdate(), Acore::PowerPctOrderPred::operator()(), Player::outDebugValues(), spell_item_oracle_ablutions::PrepareSpellScript(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), spell_bronjahm_magic_bane::RecalculateDamage(), Creature::Regenerate(), Player::Regenerate(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetPower(), setPowerType(), Player::SummonPet(), boss_selin_fireheart::UpdateAI(), boss_moam::UpdateAI(), boss_faction_championsAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), Player::UpdateCharmedAI(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxSkillValueForLevel()

uint16 Unit::GetMaxSkillValueForLevel ( Unit const *  target = nullptr) const
inline
995{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }
uint8 getLevelForTarget(WorldObject const *) const override
Definition: Unit.h:856

References GetLevel(), and getLevelForTarget().

Referenced by Player::GetMaxSkillValueForLevel(), GetUnitCriticalChance(), GetWeaponSkillValue(), isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), and SpellTakenCritChance().

◆ GetMechanicResistChance()

int32 Unit::GetMechanicResistChance ( SpellInfo const *  spell)
3134{
3135 if (!spell)
3136 return 0;
3137 int32 resist_mech = 0;
3138 for (uint8 eff = 0; eff < MAX_SPELL_EFFECTS; ++eff)
3139 {
3140 if (!spell->Effects[eff].IsEffect())
3141 break;
3142 int32 effect_mech = spell->GetEffectMechanic(eff);
3143 if (effect_mech)
3144 {
3146 if (resist_mech < temp)
3147 resist_mech = temp;
3148 }
3149 }
3150 return resist_mech;
3151}
@ SPELL_AURA_MOD_MECHANIC_RESISTANCE
Definition: SpellAuraDefines.h:180
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:6014

References SpellInfo::Effects, SpellInfo::GetEffectMechanic(), GetTotalAuraModifierByMiscValue(), MAX_SPELL_EFFECTS, and SPELL_AURA_MOD_MECHANIC_RESISTANCE.

Referenced by MagicSpellHitResult(), and MeleeSpellHitResult().

◆ GetMeleeAttackPoint()

bool Unit::GetMeleeAttackPoint ( Unit attacker,
Position pos 
)
2668{
2669 if (!attacker)
2670 {
2671 return false;
2672 }
2673
2674 AttackerSet attackers = getAttackers();
2675
2676 if (attackers.size() <= 1) // if the attackers are not more than one
2677 {
2678 return false;
2679 }
2680
2681 float meleeReach = GetExactDist2d(attacker);
2682 if (meleeReach <= 0)
2683 {
2684 return false;
2685 }
2686
2687 float minAngle = 0;
2688 Unit *refUnit = nullptr;
2689 uint32 validAttackers = 0;
2690
2691 double attackerSize = attacker->GetCollisionRadius();
2692
2693 for (auto const& otherAttacker: attackers)
2694 {
2695 // if the otherAttacker is not valid, skip
2696 if (!otherAttacker || otherAttacker->GetGUID() == attacker->GetGUID() ||
2697 !otherAttacker->IsWithinMeleeRange(this) || otherAttacker->isMoving())
2698 {
2699 continue;
2700 }
2701
2702 float curretAngle = atan(attacker->GetExactDist2d(otherAttacker) / meleeReach);
2703 if (minAngle == 0 || curretAngle < minAngle)
2704 {
2705 minAngle = curretAngle;
2706 refUnit = otherAttacker;
2707 }
2708
2709 validAttackers++;
2710 }
2711
2712 if (!validAttackers || !refUnit)
2713 {
2714 return false;
2715 }
2716
2717 float contactDist = attackerSize + refUnit->GetCollisionRadius();
2718 float requiredAngle = atan(contactDist / meleeReach);
2719 float attackersAngle = atan(attacker->GetExactDist2d(refUnit) / meleeReach);
2720
2721 // in instance: the more attacker there are, the higher will be the tollerance
2722 // outside: creatures should not intersecate
2723 float angleTollerance = attacker->GetMap()->IsDungeon() ? requiredAngle - requiredAngle * tanh(validAttackers / 5.0f) : requiredAngle;
2724
2725 if (attackersAngle > angleTollerance)
2726 {
2727 return false;
2728 }
2729
2730 double angle = atan(contactDist / meleeReach);
2731
2732 float angularRadius = frand(0.1f, 0.3f) + angle;
2733 int8 direction = (urand(0, 1) ? -1 : 1);
2734 float currentAngle = GetAngle(refUnit);
2735 float absAngle = currentAngle + angularRadius * direction;
2736
2737 float x, y, z;
2738 float distance = meleeReach - GetObjectSize();
2739 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle);
2740
2741 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2742 {
2743 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle * -1); // try the other side
2744
2745 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2746 {
2747 return false;
2748 }
2749 }
2750
2751 pos.Relocate(x, y, z);
2752
2753 return true;
2754}
std::int8_t int8
Definition: Define.h:105
float frand(float min, float max)
Definition: Random.cpp:57
void GetNearPoint(WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
Definition: Object.cpp:2626
float GetExactDist2d(const float x, const float y) const
Definition: Position.h:166
float GetCollisionRadius() const override
this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by t...
Definition: Unit.cpp:21087
std::unordered_set< Unit * > AttackerSet
Definition: Unit.h:632
AttackerSet const & getAttackers() const
Definition: Unit.h:786
bool IsDungeon() const
Definition: Map.h:448

References frand(), Position::GetAngle(), getAttackers(), GetCollisionRadius(), Position::GetExactDist2d(), Object::GetGUID(), WorldObject::GetMap(), WorldObject::GetNearPoint(), WorldObject::GetObjectSize(), Map::IsDungeon(), Position::Relocate(), and urand().

Referenced by MotionMaster::MoveCircleTarget().

◆ GetMeleeCritChanceReduction()

float Unit::GetMeleeCritChanceReduction ( ) const
inline

◆ GetMeleeCritDamageReduction()

uint32 Unit::GetMeleeCritDamageReduction ( uint32  damage) const
inline
1032{ return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_MELEE, 2.2f, 33.0f, damage); }
uint32 GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) const
Definition: Unit.cpp:19181

References CR_CRIT_TAKEN_MELEE, and GetCombatRatingDamageReduction().

Referenced by ApplyResilience(), and processDummyAuras().

◆ GetMeleeDamageReduction()

uint32 Unit::GetMeleeDamageReduction ( uint32  damage) const
inline

◆ GetMeleeDamageSchoolMask()

virtual SpellSchoolMask Unit::GetMeleeDamageSchoolMask ( WeaponAttackType  attackType = BASE_ATTACK,
uint8  damageIndex = 0 
) const
pure virtual

Implemented in Player, and Creature.

Referenced by CalculateMeleeDamage().

◆ GetMeleeHitRedirectTarget()

Unit * Unit::GetMeleeHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo = nullptr 
)
11044{
11046 for (AuraEffectList::const_iterator i = hitTriggerAuras.begin(); i != hitTriggerAuras.end(); ++i)
11047 {
11048 if (Unit* magnet = (*i)->GetBase()->GetCaster())
11049 if (_IsValidAttackTarget(magnet, spellInfo) && magnet->IsWithinLOSInMap(this)
11050 && (!spellInfo || (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11051 && spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK)))
11052 if (roll_chance_i((*i)->GetAmount()))
11053 {
11054 (*i)->GetBase()->DropCharge(AURA_REMOVE_BY_EXPIRE);
11055 return magnet;
11056 }
11057 }
11058 return victim;
11059}
bool roll_chance_i(int chance)
Definition: Random.h:59
@ SPELL_AURA_ADD_CASTER_HIT_TRIGGER
Definition: SpellAuraDefines.h:174

References _IsValidAttackTarget(), AURA_REMOVE_BY_EXPIRE, SpellInfo::CheckExplicitTarget(), SpellInfo::CheckTarget(), GetAuraEffectsByType(), roll_chance_i(), SPELL_AURA_ADD_CASTER_HIT_TRIGGER, and SPELL_CAST_OK.

Referenced by AttackerStateUpdate(), spell_dk_dancing_rune_weapon::HandleProc(), and Spell::SelectExplicitTargets().

◆ GetMeleeRange()

float Unit::GetMeleeRange ( Unit const *  target) const
680{
681 float range = GetCombatReach() + target->GetCombatReach() + 4.0f / 3.0f;
682 return std::max(range, NOMINAL_MELEE_RANGE);
683}
#define NOMINAL_MELEE_RANGE
Definition: ObjectDefines.h:48
float GetCombatReach() const override
Definition: Unit.h:770

References GetCombatReach(), and NOMINAL_MELEE_RANGE.

Referenced by GetRandomContactPoint(), IsWithinMeleeRange(), CreatureAI::MoveBackwardsChecks(), and SmartScript::ProcessAction().

◆ GetMeleeReach()

float Unit::GetMeleeReach ( ) const
inline
771{ float reach = m_floatValues[UNIT_FIELD_COMBATREACH]; return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH; }
#define MIN_MELEE_REACH
Definition: ObjectDefines.h:47

References Object::m_floatValues, MIN_MELEE_REACH, and UNIT_FIELD_COMBATREACH.

Referenced by boss_veknilash::JustEngagedWith(), and npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI().

◆ GetMinionGUID()

ObjectGuid Unit::GetMinionGUID ( ) const
inline
@ UNIT_FIELD_SUMMON
Definition: UpdateFields.h:87

References Object::GetGuidValue(), and UNIT_FIELD_SUMMON.

Referenced by GetFirstControlled(), GetFirstMinion(), and OutDebugInfo().

◆ GetModelForForm()

uint32 Unit::GetModelForForm ( ShapeshiftForm  form,
uint32  spellId 
) const
19188{
19189 // Hardcoded cases
19190 switch (spellId)
19191 {
19192 case 7090: // Bear form
19193 return 29414;
19194 case 35200: // Roc form
19195 return 4877;
19196 default:
19197 break;
19198 }
19199
19200 if (IsPlayer())
19201 {
19202 switch (form)
19203 {
19204 case FORM_CAT:
19205 // Based on Hair color
19206 if (getRace() == RACE_NIGHTELF)
19207 {
19208 uint8 hairColor = GetByteValue(PLAYER_BYTES, 3);
19209 switch (hairColor)
19210 {
19211 case 7: // Violet
19212 case 8:
19213 return 29405;
19214 case 3: // Light Blue
19215 return 29406;
19216 case 0: // Green
19217 case 1: // Light Green
19218 case 2: // Dark Green
19219 return 29407;
19220 case 4: // White
19221 return 29408;
19222 default: // original - Dark Blue
19223 return 892;
19224 }
19225 }
19226 // Based on Skin color
19227 else if (getRace() == RACE_TAUREN)
19228 {
19229 uint8 skinColor = GetByteValue(PLAYER_BYTES, 0);
19230 // Male
19231 if (getGender() == GENDER_MALE)
19232 {
19233 switch (skinColor)
19234 {
19235 case 12: // White
19236 case 13:
19237 case 14:
19238 case 18: // Completly White
19239 return 29409;
19240 case 9: // Light Brown
19241 case 10:
19242 case 11:
19243 return 29410;
19244 case 6: // Brown
19245 case 7:
19246 case 8:
19247 return 29411;
19248 case 0: // Dark
19249 case 1:
19250 case 2:
19251 case 3: // Dark Grey
19252 case 4:
19253 case 5:
19254 return 29412;
19255 default: // original - Grey
19256 return 8571;
19257 }
19258 }
19259 // Female
19260 else switch (skinColor)
19261 {
19262 case 10: // White
19263 return 29409;
19264 case 6: // Light Brown
19265 case 7:
19266 return 29410;
19267 case 4: // Brown
19268 case 5:
19269 return 29411;
19270 case 0: // Dark
19271 case 1:
19272 case 2:
19273 case 3:
19274 return 29412;
19275 default: // original - Grey
19276 return 8571;
19277 }
19278 }
19280 return 892;
19281 else
19282 return 8571;
19283 case FORM_DIREBEAR:
19284 case FORM_BEAR:
19285 // Based on Hair color
19286 if (getRace() == RACE_NIGHTELF)
19287 {
19288 uint8 hairColor = GetByteValue(PLAYER_BYTES, 3);
19289 switch (hairColor)
19290 {
19291 case 0: // Green
19292 case 1: // Light Green
19293 case 2: // Dark Green
19294 return 29413; // 29415?
19295 case 6: // Dark Blue
19296 return 29414;
19297 case 4: // White
19298 return 29416;
19299 case 3: // Light Blue
19300 return 29417;
19301 default: // original - Violet
19302 return 2281;
19303 }
19304 }
19305 // Based on Skin color
19306 else if (getRace() == RACE_TAUREN)
19307 {
19308 uint8 skinColor = GetByteValue(PLAYER_BYTES, 0);
19309 // Male
19310 if (getGender() == GENDER_MALE)
19311 {
19312 switch (skinColor)
19313 {
19314 case 0: // Dark (Black)
19315 case 1:
19316 case 2:
19317 return 29418;
19318 case 3: // White
19319 case 4:
19320 case 5:
19321 case 12:
19322 case 13:
19323 case 14:
19324 return 29419;
19325 case 9: // Light Brown/Grey
19326 case 10:
19327 case 11:
19328 case 15:
19329 case 16:
19330 case 17:
19331 return 29420;
19332 case 18: // Completly White
19333 return 29421;
19334 default: // original - Brown
19335 return 2289;
19336 }
19337 }
19338 // Female
19339 else switch (skinColor)
19340 {
19341 case 0: // Dark (Black)
19342 case 1:
19343 return 29418;
19344 case 2: // White
19345 case 3:
19346 return 29419;
19347 case 6: // Light Brown/Grey
19348 case 7:
19349 case 8:
19350 case 9:
19351 return 29420;
19352 case 10: // Completly White
19353 return 29421;
19354 default: // original - Brown
19355 return 2289;
19356 }
19357 }
19359 return 2281;
19360 else
19361 return 2289;
19362 case FORM_FLIGHT:
19364 return 20857;
19365 return 20872;
19366 case FORM_FLIGHT_EPIC:
19368 return 21243;
19369 return 21244;
19370 default:
19371 break;
19372 }
19373 }
19374
19375 uint32 modelid = 0;
19376 SpellShapeshiftFormEntry const* formEntry = sSpellShapeshiftFormStore.LookupEntry(form);
19377 if (formEntry && formEntry->modelID_A)
19378 {
19379 // Take the alliance modelid as default
19380 if (!IsPlayer())
19381 return formEntry->modelID_A;
19382 else
19383 {
19385 modelid = formEntry->modelID_A;
19386 else
19387 modelid = formEntry->modelID_H;
19388
19389 // If the player is horde but there are no values for the horde modelid - take the alliance modelid
19390 if (!modelid && Player::TeamIdForRace(getRace()) == TEAM_HORDE)
19391 modelid = formEntry->modelID_A;
19392 }
19393 }
19394
19395 return modelid;
19396}
@ FORM_DIREBEAR
Definition: UnitDefines.h:77
@ FORM_FLIGHT_EPIC
Definition: UnitDefines.h:94
@ FORM_CAT
Definition: UnitDefines.h:70
@ FORM_FLIGHT
Definition: UnitDefines.h:96
@ FORM_BEAR
Definition: UnitDefines.h:74
@ PLAYER_BYTES
Definition: UpdateFields.h:181
@ GENDER_MALE
Definition: SharedDefines.h:61
@ RACE_NIGHTELF
Definition: SharedDefines.h:74
@ RACE_TAUREN
Definition: SharedDefines.h:76
@ TEAM_ALLIANCE
Definition: SharedDefines.h:760
@ TEAM_HORDE
Definition: SharedDefines.h:761
static TeamId TeamIdForRace(uint8 race)
Definition: Player.cpp:5830
uint8 getGender() const
Definition: Unit.h:752
uint8 getRace(bool original=false) const
Definition: Unit.cpp:20993
uint32 modelID_H
Definition: DBCStructure.h:1826
uint32 modelID_A
Definition: DBCStructure.h:1825

References FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_FLIGHT, FORM_FLIGHT_EPIC, GENDER_MALE, Object::GetByteValue(), getGender(), getRace(), Object::IsPlayer(), SpellShapeshiftFormEntry::modelID_A, SpellShapeshiftFormEntry::modelID_H, PLAYER_BYTES, RACE_NIGHTELF, RACE_TAUREN, sSpellShapeshiftFormStore, TEAM_ALLIANCE, TEAM_HORDE, and Player::TeamIdForRace().

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), and RestoreDisplayId().

◆ GetModelForTotem()

uint32 Unit::GetModelForTotem ( PlayerTotemType  totemType)
19399{
19400 switch (getRace())
19401 {
19402 case RACE_ORC:
19403 {
19404 switch (totemType)
19405 {
19406 case SUMMON_TYPE_TOTEM_FIRE: // fire
19407 return 30758;
19408 case SUMMON_TYPE_TOTEM_EARTH: // earth
19409 return 30757;
19410 case SUMMON_TYPE_TOTEM_WATER: // water
19411 return 30759;
19412 case SUMMON_TYPE_TOTEM_AIR: // air
19413 return 30756;
19414 }
19415 break;
19416 }
19417 case RACE_DWARF:
19418 {
19419 switch (totemType)
19420 {
19421 case SUMMON_TYPE_TOTEM_FIRE: // fire
19422 return 30754;
19423 case SUMMON_TYPE_TOTEM_EARTH: // earth
19424 return 30753;
19425 case SUMMON_TYPE_TOTEM_WATER: // water
19426 return 30755;
19427 case SUMMON_TYPE_TOTEM_AIR: // air
19428 return 30736;
19429 }
19430 break;
19431 }
19432 case RACE_TROLL:
19433 {
19434 switch (totemType)
19435 {
19436 case SUMMON_TYPE_TOTEM_FIRE: // fire
19437 return 30762;
19438 case SUMMON_TYPE_TOTEM_EARTH: // earth
19439 return 30761;
19440 case SUMMON_TYPE_TOTEM_WATER: // water
19441 return 30763;
19442 case SUMMON_TYPE_TOTEM_AIR: // air
19443 return 30760;
19444 }
19445 break;
19446 }
19447 case RACE_TAUREN:
19448 {
19449 switch (totemType)
19450 {
19451 case SUMMON_TYPE_TOTEM_FIRE: // fire
19452 return 4589;
19453 case SUMMON_TYPE_TOTEM_EARTH: // earth
19454 return 4588;
19455 case SUMMON_TYPE_TOTEM_WATER: // water
19456 return 4587;
19457 case SUMMON_TYPE_TOTEM_AIR: // air
19458 return 4590;
19459 }
19460 break;
19461 }
19462 case RACE_DRAENEI:
19463 {
19464 switch (totemType)
19465 {
19466 case SUMMON_TYPE_TOTEM_FIRE: // fire
19467 return 19074;
19468 case SUMMON_TYPE_TOTEM_EARTH: // earth
19469 return 19073;
19470 case SUMMON_TYPE_TOTEM_WATER: // water
19471 return 19075;
19472 case SUMMON_TYPE_TOTEM_AIR: // air
19473 return 19071;
19474 }
19475 break;
19476 }
19477 default: // One standard for other races.
19478 {
19479 switch (totemType)
19480 {
19481 case SUMMON_TYPE_TOTEM_FIRE: // fire
19482 return 4589;
19483 case SUMMON_TYPE_TOTEM_EARTH: // earth
19484 return 4588;
19485 case SUMMON_TYPE_TOTEM_WATER: // water
19486 return 4587;
19487 case SUMMON_TYPE_TOTEM_AIR: // air
19488 return 4590;
19489 }
19490 break;
19491 }
19492 }
19493 return 0;
19494}
@ SUMMON_TYPE_TOTEM_EARTH
Definition: Unit.h:608
@ SUMMON_TYPE_TOTEM_WATER
Definition: Unit.h:609
@ SUMMON_TYPE_TOTEM_FIRE
Definition: Unit.h:607
@ SUMMON_TYPE_TOTEM_AIR
Definition: Unit.h:610
@ RACE_TROLL
Definition: SharedDefines.h:78
@ RACE_ORC
Definition: SharedDefines.h:72
@ RACE_DRAENEI
Definition: SharedDefines.h:81
@ RACE_DWARF
Definition: SharedDefines.h:73

References getRace(), RACE_DRAENEI, RACE_DWARF, RACE_ORC, RACE_TAUREN, RACE_TROLL, SUMMON_TYPE_TOTEM_AIR, SUMMON_TYPE_TOTEM_EARTH, SUMMON_TYPE_TOTEM_FIRE, and SUMMON_TYPE_TOTEM_WATER.

◆ GetModifierValue()

float Unit::GetModifierValue ( UnitMods  unitMod,
UnitModifierType  modifierType 
) const
15275{
15276 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15277 {
15278 LOG_ERROR("entities.unit", "attempt to access non-existing modifier value from UnitMods!");
15279 return 0.0f;
15280 }
15281
15282 if (modifierType == TOTAL_PCT && m_auraModifiersGroup[unitMod][modifierType] <= 0.0f)
15283 return 0.0f;
15284
15285 return m_auraModifiersGroup[unitMod][modifierType];
15286}
@ MODIFIER_TYPE_END
Definition: Unit.h:130

References LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, TOTAL_PCT, and UNIT_MOD_END.

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectWeaponDmg(), Guardian::UpdateArmor(), Player::UpdateArmor(), Creature::UpdateAttackPowerAndDamage(), Guardian::UpdateAttackPowerAndDamage(), Player::UpdateAttackPowerAndDamage(), Guardian::UpdateDamagePhysical(), Guardian::UpdateMaxHealth(), Player::UpdateMaxHealth(), Guardian::UpdateMaxPower(), Player::UpdateMaxPower(), and Player::UpdateResistances().

◆ GetMotionMaster() [1/2]

MotionMaster * Unit::GetMotionMaster ( )
inline
1615{ return i_motionMaster; }

References i_motionMaster.

Referenced by _ExitVehicle(), HomeMovementGenerator< Creature >::_setTargetLocation(), PetAI::_stopAttack(), BattlegroundAV::AddAVCreature(), npc_mograine::npc_mograineAI::AshbringerEvent(), UnitAI::AttackStart(), FollowerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alyson_antille::boss_alyson_antilleAI::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::AttackStart(), boss_magus_telestra::boss_magus_telestraAI::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), UnitAI::AttackStartCaster(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CleanupBeforeRemoveFromMap(), boss_isalien::DamageTaken(), boss_julianne::DamageTaken(), npc_mograine::npc_mograineAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_nightbane::DoAction(), npc_apothecary_genericAI::DoAction(), npc_chained_spirit::DoAction(), boss_anetheron::DoAction(), boss_azgalor::DoAction(), boss_kazrogal::DoAction(), boss_rage_winterchill::DoAction(), npc_hyjal_ground_trash::DoAction(), npc_hyjal_gargoyle::DoAction(), npc_hyjal_frost_wyrm::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_saurfang_event::npc_saurfang_eventAI::DoAction(), boss_professor_putricide::boss_professor_putricideAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_argent_captainAI::DoAction(), npc_icc_spire_frostwyrm::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::DoAction(), npc_ahune_bunny::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_living_mojo::npc_living_mojoAI::DoAction(), npc_power_spark::npc_power_sparkAI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_maiev_illidan::DoAction(), npc_akama_shade::DoAction(), boss_nazan::DoAction(), boss_ghazan::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), PetAI::DoAttack(), Creature::DoFleeToGetAssistance(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoStartMovement(), ScriptedAI::DoStartNoMovement(), go_commandscript::DoTeleport(), Spell::EffectCharge(), Spell::EffectChargeDest(), Spell::EffectDistract(), Spell::EffectJump(), Spell::EffectJumpDest(), Spell::EffectPullTowards(), Spell::EffectSummonType(), boss_jindo::EnterEvadeMode(), npc_black_morass_summoned_add::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), npc_argent_captainAI::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), npc_burning_spirit::npc_burning_spiritAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_mrfloppy::npc_mrfloppyAI::EnterEvadeMode(), npc_pet_gen_argent_pony_bridle::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), boss_halazzi::EnterPhase(), boss_zuljin::boss_zuljinAI::EnterPhase(), VehicleDespawnEvent::Execute(), RestoreAttack::Execute(), OrcMoveEvent::Execute(), NpcRunToHome::Execute(), UtherBatteredHiltEvent::Execute(), SlaveRunEvent::Execute(), DelayedMovementEvent::Execute(), DaranavanMoveEvent::Execute(), FrostwyrmLandEvent::Execute(), SACActivateEvent::Execute(), AssistanceMovementGenerator::Finalize(), npc_dark_iron_guzzler::FindNextKeg(), npc_hallows_end_soh::FinishEvent(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::FinishQuest(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), boss_nightbane::FlyToClosestPreFlyWayPoint(), Creature::FocusTarget(), CreatureGroup::FormationReset(), boss_volkhan::boss_volkhanAI::GoToAnvil(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_apothecary_lingering_fumes::HandleAfterCast(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), misc_commandscript::HandleAppearCommand(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), misc_commandscript::HandleComeToMeCommand(), spell_q12589_shoot_rjr::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_icc_geist_alarm::HandleEvent(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), spell_item_toxic_wasteling::HandleJump(), AuraEffect::HandleModPossessPet(), misc_commandscript::HandleMovegensCommand(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), npc_commandscript::HandleNpcFollowCommand(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), npc_commandscript::HandleNpcUnFollowCommand(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePlayerLoginFromDB(), spell_entropius_black_hole_effect::HandlePull(), spell_boss_magus_telestra_gravity_well::HandlePull(), PetAI::HandleReturnMovement(), spell_the_lich_king_valkyr_target_search::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_gen_ayamiss_swarmer_loop::HandleScript(), WorldSession::HandleSetRaidDifficultyOpcode(), spell_sindragosa_icy_grip_jump::HandleSpecial(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), spell_item_draenic_pale_ale::HandleSummon(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), wp_commandscript::HandleWpLoadCommand(), wp_commandscript::HandleWpUnLoadCommand(), boss_captain_skarloc::InitializeAI(), boss_lieutenant_drake::InitializeAI(), boss_glob_of_viscidus::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), boss_eck::boss_eckAI::InitializeAI(), npc_preparations_for_war_vehicle::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), npc_pet_dk_dancing_rune_weapon::npc_pet_dk_dancing_rune_weaponAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Totem::InitSummon(), boss_grand_warlock_nethekurse::IntroRP(), Creature::IsFreeToMove(), IsMutualChase(), boss_gahzranka::boss_gahzrankaAI::IsSummonedBy(), boss_aeonus::IsSummonedBy(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::IsSummonedBy(), npc_burning_spirit::npc_burning_spiritAI::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::IsSummonedBy(), npc_spirit_shade::npc_spirit_shadeAI::IsSummonedBy(), JumpTo(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), boss_ayamiss::JustDied(), npc_cyclone::JustEngagedWith(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_grandmaster_vorpil::JustEngagedWith(), boss_warlord_kalithresh::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nazan::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_ayamiss::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_alar::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), SmartAI::JustReachedHome(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), boss_ghazan::JustReachedHome(), boss_grand_warlock_nethekurse::JustReachedHome(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_auriaya::boss_auriayaAI::JustSummoned(), npc_frosthound::npc_frosthoundAI::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), boss_mekgineer_steamrigger::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_xevozz::boss_xevozzAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustSummoned(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::JustSummoned(), boss_vexallus::JustSummoned(), npc_kalecgos_kj::npc_kalecgos_kjAI::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_hadronox::boss_hadronoxAI::JustSummoned(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_akama_shade::JustSummoned(), npc_creature_generator_akama::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), boss_mennu_the_betrayer::JustSummoned(), boss_kaelthas::JustSummoned(), boss_mechano_lord_capacitus::JustSummoned(), npc_rinji::npc_rinjiAI::JustSummoned(), npc_maghar_captive::npc_maghar_captiveAI::JustSummoned(), boss_ayamiss::JustSummoned(), Player::KillPlayer(), KnockbackFrom(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), Player::LeaveBattleground(), Creature::Motion_Initialize(), SmartAI::MoveAway(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), PetAI::MovementInform(), boss_ebonroc::boss_ebonrocAI::MovementInform(), boss_nightbane::MovementInform(), boss_bug_trio::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_four_horsemen::boss_four_horsemenAI::MovementInform(), npc_akama_illidan::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_cameron::MoveTheChildren(), boss_four_horsemen::boss_four_horsemenAI::MoveToCorner(), npc_concentrated_ball::npc_concentrated_ballAI::MoveToNextPoint(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), NearTeleportTo(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_omen::npc_omenAI::npc_omenAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::npc_pos_after_first_bossAI(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::npc_ulduar_saronite_vaporsAI(), spell_halion_twilight_phasing_aura::OnApply(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_hyjal_jaina::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_kernobee::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), spell_chapter5_light_of_dawn_aura::spell_chapter5_light_of_dawn_aura_AuraScript::OnRemove(), spell_halion_twilight_phasing_aura::OnRemove(), SplineHandler::operator()(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_oculus_drake::npc_oculus_drakeAI::PassengerBoarded(), npc_vics_flying_machine::npc_vics_flying_machineAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), boss_nightbane::PathEndReached(), boss_anetheron::PathEndReached(), boss_rage_winterchill::PathEndReached(), npc_hyjal_ground_trash::PathEndReached(), npc_hyjal_frost_wyrm::PathEndReached(), boss_ambassador_hellmaw::PathEndReached(), npc_akama_illidan::PathEndReached(), boss_nefarian::PathEndReached(), npc_hyjal_gargoyle::PathEndReached(), PauseMovement(), SmartAI::PausePath(), PetSpellFail(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::PickNewLocation(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), propagateSpeedChange(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), RemoveCharmedBy(), boss_the_beast::boss_thebeastAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_kalec::boss_kalecAI::Reset(), npc_janalai_hatchling::npc_janalai_hatchlingAI::Reset(), boss_arlokk::boss_arlokkAI::Reset(), npc_zulian_prowler::npc_zulian_prowlerAI::Reset(), npc_batrider::Reset(), npc_brew_bubble::Reset(), boss_archimonde::Reset(), boss_ayamiss::Reset(), boss_bug_trio::Reset(), boss_jedoga_shadowseeker::Reset(), npc_kinetic_bomb::npc_kinetic_bombAI::Reset(), npc_assembly_lightning::npc_assembly_lightningAI::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_released_offspring_harkoa::npc_released_offspring_harkoaAI::Reset(), npc_voidtraveler::Reset(), boss_lady_vashj::Reset(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_infernal_attacker::npc_infernal_attackerAI::Reset(), npc_pet_gen_gnomish_flame_turret::Reset(), Creature::Respawn(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), ResumeMovement(), SmartAI::ResumePath(), Resurrect(), SmartAI::ReturnToLastOOCPos(), npc_escortAI::ReturnToLastPoint(), boss_illidan_stormrage::ScheduleAbilities(), boss_magtheridon::ScheduleCombatEvents(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), boss_nightbane::ScheduleLand(), boss_laj::ScheduleTasks(), boss_selin_fireheart::SelectNearestCrystal(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), WorldSession::SendDoFlight(), boss_sartharion::boss_sartharionAI::SendLavaWaves(), SetCharmedBy(), SmartAI::SetCombatMove(), SetConfused(), boss_grand_warlock_nethekurse::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), gunship_npc_AI::SetData(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::SetData(), boss_the_beast::boss_thebeastAI::SetData(), npc_eastvale_peasent::SetData(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::SetData(), setDeathState(), Creature::setDeathState(), SetFeared(), SmartAI::SetFollow(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::SetGUID(), SetInCombatState(), Player::SetMover(), SetSpeed(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_akama_illidan::sGossipSelect(), npc_akama_shade::sGossipSelect(), boss_thorim::boss_thorimAI::SpawnArenaNPCs(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::SpellHit(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::SpellHit(), npc_saurfang_event::npc_saurfang_eventAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_forest_frog::npc_forest_frogAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), npc_pet_gen_fetch_ball::SpellHitTarget(), boss_ionar::boss_ionarAI::Split(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_escortAI::Start(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), FollowerAI::StartFollow(), WaypointMovementGenerator< Creature >::StartMove(), npc_stillpine_capitive::npc_stillpine_capitiveAI::StartMoving(), SmartAI::StartPath(), SmartAI::StopFollow(), SmartAI::StopPath(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_vazruden_the_herald::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), Spell::SummonGuardian(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave(), Player::TeleportTo(), CreatureAI::TriggerAlert(), Pet::Update(), Update(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_gyth::boss_gythAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), boss_selin_fireheart::UpdateAI(), npc_eye_of_acherus::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kalec::boss_kalecAI::UpdateAI(), npc_singularity::npc_singularityAI::UpdateAI(), npc_cameron::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_grand_magister_rommath::npc_grand_magister_rommathAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_akilzon_eagle::npc_akilzon_eagleAI::UpdateAI(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), npc_janalai_hatcher::npc_janalai_hatcherAI::UpdateAI(), npc_forest_frog::npc_forest_frogAI::UpdateAI(), npc_harrison_jones::npc_harrison_jonesAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), npc_twilight_volunteer::UpdateAI(), npc_taldaram_flamesphere::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::UpdateAI(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_venture_co_straggler::npc_venture_co_stragglerAI::UpdateAI(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_demonic_vapor::npc_demonic_vaporAI::UpdateAI(), npc_batrider::UpdateAI(), npc_concentrated_ball::npc_concentrated_ballAI::UpdateAI(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::UpdateAI(), npc_xt002_boombot::npc_xt002_boombotAI::UpdateAI(), Player::UpdateCharmedAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_emily::npc_emilyAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ GetMotionMaster() [2/2]

const MotionMaster * Unit::GetMotionMaster ( ) const
inline
1616{ return i_motionMaster; }

References i_motionMaster.

◆ GetMountID()

◆ GetNativeDisplayId()

◆ GetNativeObjectScale()

virtual float Unit::GetNativeObjectScale ( ) const
inlinevirtual

Reimplemented in Creature, and Pet.

1519{ return 1.0f; }

Referenced by RecalculateObjectScale().

◆ GetNegStat()

float Unit::GetNegStat ( Stats  stat) const
inline
1451{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_NEGSTAT0.

◆ GetNextRandomRaidMemberOrPet()

Unit * Unit::GetNextRandomRaidMemberOrPet ( float  radius)
11101{
11102 Player* player = nullptr;
11103 if (IsPlayer())
11104 player = ToPlayer();
11105 // Should we enable this also for charmed units?
11106 else if (IsCreature() && IsPet())
11107 player = GetOwner()->ToPlayer();
11108
11109 if (!player)
11110 return nullptr;
11111 Group* group = player->GetGroup();
11112 // When there is no group check pet presence
11113 if (!group)
11114 {
11115 // We are pet now, return owner
11116 if (player != this)
11117 return IsWithinDistInMap(player, radius) ? player : nullptr;
11118 Unit* pet = GetGuardianPet();
11119 // No pet, no group, nothing to return
11120 if (!pet)
11121 return nullptr;
11122 // We are owner now, return pet
11123 return IsWithinDistInMap(pet, radius) ? pet : nullptr;
11124 }
11125
11126 std::vector<Unit*> nearMembers;
11127 // reserve place for players and pets because resizing vector every unit push is unefficient (vector is reallocated then)
11128 nearMembers.reserve(group->GetMembersCount() * 2);
11129
11130 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
11131 if (Player* Target = itr->GetSource())
11132 {
11133 if (Target != this && !IsWithinDistInMap(Target, radius))
11134 continue;
11135
11136 // IsHostileTo check duel and controlled by enemy
11137 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
11138 nearMembers.push_back(Target);
11139
11140 // Push player's pet to vector
11141 if (Unit* pet = Target->GetGuardianPet())
11142 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
11143 nearMembers.push_back(pet);
11144 }
11145
11146 if (nearMembers.empty())
11147 return nullptr;
11148
11149 uint32 randTarget = urand(0, nearMembers.size() - 1);
11150 return nearMembers[randTarget];
11151}
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition: Object.cpp:1321
Group * GetGroup()
Definition: Player.h:2450
Guardian * GetGuardianPet() const
Definition: Unit.cpp:10642
Definition: Group.h:169
uint32 GetMembersCount() const
Definition: Group.h:245
GroupReference * GetFirstMember()
Definition: Group.h:243
Definition: GroupReference.h:27
GroupReference * next()
Definition: GroupReference.h:36

References Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), Group::GetMembersCount(), GetOwner(), Object::IsCreature(), IsHostileTo(), IsPet(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), GroupReference::next(), Object::ToPlayer(), and urand().

Referenced by HandleAuraRaidProcFromCharge(), and AuraEffect::HandleRaidProcFromChargeAuraProc().

◆ GetNpcFlags()

◆ GetOldFactionId()

uint32 Unit::GetOldFactionId ( ) const
inline
1787{ return _oldFactionId; }

References _oldFactionId.

Referenced by npc_chesspiece::OnCharmed().

◆ GetOwnedAura()

Aura * Unit::GetOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
Aura except = nullptr 
) const
4761{
4762 AuraMapBounds range = m_ownedAuras.equal_range(spellId);
4763 for (AuraMap::const_iterator itr = range.first; itr != range.second; ++itr)
4764 {
4765 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask)
4766 && (!casterGUID || itr->second->GetCasterGUID() == casterGUID)
4767 && (!itemCasterGUID || itr->second->GetCastItemGUID() == itemCasterGUID)
4768 && (!except || except != itr->second))
4769 {
4770 return itr->second;
4771 }
4772 }
4773 return nullptr;
4774}
std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
Definition: Unit.h:636

References m_ownedAuras.

Referenced by _TryStackingOrRefreshingExistingAura().

◆ GetOwnedAuras() [1/2]

◆ GetOwnedAuras() [2/2]

AuraMap const & Unit::GetOwnedAuras ( ) const
inline
1322{ return m_ownedAuras; }

References m_ownedAuras.

◆ GetOwner()

Unit * Unit::GetOwner ( ) const
10592{
10593 if (ObjectGuid ownerGUID = GetOwnerGUID())
10594 return ObjectAccessor::GetUnit(*this, ownerGUID);
10595
10596 return nullptr;
10597}

References GetOwnerGUID(), and ObjectAccessor::GetUnit().

Referenced by _ExitVehicle(), Acore::AnyAoETargetUnitInObjectRangeCheck::AnyAoETargetUnitInObjectRangeCheck(), ApplyDiminishingToDuration(), ApplyResilience(), TotemAI::AttackStart(), spell_dk_anti_magic_zone::CalculateAmount(), Creature::CanStartAttack(), spell_dk_blood_gorged::CheckProc(), spell_pri_mana_leech::CheckProc(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealHeal(), HostileRefMgr::deleteReferences(), npc_spring_rabbit::npc_spring_rabbitAI::DoAction(), Spell::DoAllEffectOnLaunchTarget(), Spell::DoAllEffectOnTarget(), PetAI::DoAttack(), Spell::EffectDispel(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), boss_illidari_council_memberAI::EnterEvadeMode(), GetCharmerOrOwner(), GetCombatRatingReduction(), GetNextRandomRaidMemberOrPet(), GetReactionTo(), GetSpellModOwner(), spell_warl_seduction::HandleAuraApply(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_sha_healing_stream_totem::HandleDummy(), spell_q12277_wintergarde_mine_explosion::HandleDummy(), spell_sha_mana_tide_totem::HandleDummy(), HandleDummyAuraProc(), spell_mount_check_aura::HandleEffectPeriodic(), spell_gen_gryphon_wyvern_mount_check::HandleEffectPeriodic(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), modify_commandscript::HandleModifyTalentCommand(), WorldSession::HandlePetActionHelper(), spell_warl_demonic_pact_aura::HandleProc(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), npc_pet_dk_dancing_rune_weapon::npc_pet_dk_dancing_rune_weaponAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), IsAlwaysVisibleFor(), IsPetAura(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::JustDied(), Kill(), MagicSpellHitResult(), MeleeDamageBonusDone(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_khunok_the_behemoth::npc_khunok_the_behemothAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_hun_aspect_of_the_beast::OnPetApply(), Acore::MostHPMissingGroupInRange::operator()(), PetSpellFail(), RemoveFromWorld(), npc_target_dummy::npc_target_dummyAI::Reset(), npc_spring_rabbit::npc_spring_rabbitAI::Reset(), RestoreFaction(), Creature::SelectVictim(), SendPetActionFeedback(), SendPetAIReaction(), SendPetTalk(), SetHealth(), SetMaxHealth(), SetMaxPower(), SetPower(), setPowerType(), SetStunned(), SpellDamageBonusDone(), SpellHealingBonusDone(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and UpdateAuraForGroup().

◆ GetOwnerGUID()

ObjectGuid Unit::GetOwnerGUID ( ) const
inline
@ UNIT_FIELD_SUMMONEDBY
Definition: UpdateFields.h:90

References Object::GetGuidValue(), and UNIT_FIELD_SUMMONEDBY.

Referenced by Pet::AddToWorld(), npc_living_mojo::npc_living_mojoAI::AttackStart(), BuildValuesUpdate(), PetAI::CanAttack(), CanFreeMove(), CanHaveThreatList(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), DealDamage(), Spell::DoAllEffectOnTarget(), FollowMovementGenerator< T >::DoUpdate(), GetCharmerOrOwnerGUID(), GetOwner(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModInvisibilityDetect(), AuraEffect::HandleModStealth(), AuraEffect::HandleModStealthDetect(), AuraEffect::HandleModStealthLevel(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetRename(), HandleSpellClick(), Creature::HasMechanicTemplateImmunity(), Creature::IsDungeonBoss(), Creature::IsImmuneToKnockback(), isInAccessiblePlaceFor(), Kill(), Creature::LoadSpellTemplateImmunity(), Condition::Meets(), instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_venomhide_hatchling::OnGossipHello(), Acore::MostHPMissingGroupInRange::operator()(), PlayerOrPetCheck::operator()(), OutDebugInfo(), PetAI::ReceiveEmote(), Creature::Regenerate(), RemoveAllControlled(), RemoveEvadeAuras(), Pet::SavePetToDB(), SetMinion(), SetOwnerGUID(), SpellPctDamageModsDone(), Map::SummonCreature(), NPCStaveQuestAI::UnitIsUnfair(), Creature::Update(), and npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI().

◆ GetPartyMembers()

void Unit::GetPartyMembers ( std::list< Unit * > &  units)
18807{
18808 Unit* owner = GetCharmerOrOwnerOrSelf();
18809 Group* group = nullptr;
18810 if (owner->IsPlayer())
18811 group = owner->ToPlayer()->GetGroup();
18812
18813 if (group)
18814 {
18815 uint8 subgroup = owner->ToPlayer()->GetSubGroup();
18816
18817 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
18818 {
18819 Player* Target = itr->GetSource();
18820
18821 // IsHostileTo check duel and controlled by enemy
18822 if (Target && Target->IsInMap(owner) && Target->GetSubGroup() == subgroup && !IsHostileTo(Target))
18823 {
18824 if (Target->IsAlive())
18825 TagUnitMap.push_back(Target);
18826
18827 for (Unit::ControlSet::iterator iterator = Target->m_Controlled.begin(); iterator != Target->m_Controlled.end(); ++iterator)
18828 {
18829 if (Unit* pet = *iterator)
18830 if (pet->IsGuardian() && pet->IsAlive())
18831 TagUnitMap.push_back(pet);
18832 }
18833 }
18834 }
18835 }
18836 else
18837 {
18838 if (owner->IsAlive())
18839 TagUnitMap.push_back(owner);
18840
18841 for (Unit::ControlSet::iterator itr = owner->m_Controlled.begin(); itr != owner->m_Controlled.end(); ++itr)
18842 {
18843 if (Unit* pet = *itr)
18844 if (pet->IsGuardian() && pet->IsAlive())
18845 TagUnitMap.push_back(pet);
18846 }
18847 }
18848}
uint8 GetSubGroup() const
Definition: Player.h:2454

References GetCharmerOrOwnerOrSelf(), Group::GetFirstMember(), Player::GetGroup(), Player::GetSubGroup(), IsAlive(), IsHostileTo(), WorldObject::IsInMap(), Object::IsPlayer(), m_Controlled, GroupReference::next(), and Object::ToPlayer().

Referenced by spell_warr_improved_spell_reflection_trigger_aura::HandleRemove().

◆ GetPetGUID()

◆ GetPhaseByAuras()

uint32 Unit::GetPhaseByAuras ( ) const
19026{
19027 uint32 currentPhase = 0;
19029 if (!phases.empty())
19030 for (AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr)
19031 currentPhase |= (*itr)->GetMiscValue();
19032
19033 return currentPhase;
19034}
@ SPELL_AURA_PHASE
Definition: SpellAuraDefines.h:324

References GetAuraEffectsByType(), and SPELL_AURA_PHASE.

Referenced by Player::GetPhaseMaskForSpawn(), AuraEffect::HandlePhase(), and Player::SetGameMaster().

◆ GetPosStat()

float Unit::GetPosStat ( Stats  stat) const
inline
1450{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_POSSTAT0.

◆ GetPower()

uint32 Unit::GetPower ( Powers  power) const
inline
891{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power); }
@ UNIT_FIELD_POWER1
Definition: UpdateFields.h:97

References Object::GetUInt32Value(), and UNIT_FIELD_POWER1.

Referenced by PetAI::_canMeleeAttack(), Player::_SaveCharacter(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_igb_cannon_blast::CalculatePower(), Creature::CanCastSpell(), Spell::CheckItems(), Spell::CheckPower(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), Spell::EffectCastButtons(), Spell::EffectWeaponDmg(), Pet::FillPetInfo(), Pet::GetHappinessState(), GetPowerPct(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), AuraEffect::HandleObsModPowerAuraTick(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetAbandon(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_pal_lay_on_hands::HandleScript(), Player::InitStatsForLevel(), npc_obsidian_destroyer::JustEngagedWith(), spell_gen_replenishment_aura::Load(), Pet::LoseHappiness(), ModifyPower(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), Acore::PowerPctOrderPred::operator()(), SmartScript::ProcessAction(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::Regenerate(), Player::Regenerate(), Creature::RegenerateHealth(), Player::SaveManaBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), ScriptedAI::SelectSpell(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetMaxPower(), SetPower(), setPowerType(), spell_igb_incinerating_blast::StoreEnergy(), Aura::Update(), boss_selin_fireheart::UpdateAI(), boss_moam::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), PetAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ GetPowerPct()

float Unit::GetPowerPct ( Powers  power) const
inline
880{ return GetMaxPower(power) ? 100.f * GetPower(power) / GetMaxPower(power) : 0.0f; }
uint32 GetMaxPower(Powers power) const
Definition: Unit.h:892
uint32 GetPower(Powers power) const
Definition: Unit.h:891

References GetMaxPower(), and GetPower().

Referenced by npc_obsidian_destroyer::JustEngagedWith(), npc_obsidian_eradicator::JustEngagedWith(), npc_obsidian_nullifier::JustEngagedWith(), boss_curator::JustEngagedWith(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), and boss_hazzarah::UpdateAI().

◆ getPowerType()

◆ GetPowerTypeByAuraGroup()

Powers Unit::GetPowerTypeByAuraGroup ( UnitMods  unitMod) const
15393{
15394 switch (unitMod)
15395 {
15396 case UNIT_MOD_RAGE:
15397 return POWER_RAGE;
15398 case UNIT_MOD_FOCUS:
15399 return POWER_FOCUS;
15400 case UNIT_MOD_ENERGY:
15401 return POWER_ENERGY;
15402 case UNIT_MOD_HAPPINESS:
15403 return POWER_HAPPINESS;
15404 case UNIT_MOD_RUNE:
15405 return POWER_RUNE;
15407 return POWER_RUNIC_POWER;
15408 default:
15409 case UNIT_MOD_MANA:
15410 return POWER_MANA;
15411 }
15412}
@ UNIT_MOD_RUNE
Definition: Unit.h:154
@ UNIT_MOD_ENERGY
Definition: Unit.h:152
@ UNIT_MOD_FOCUS
Definition: Unit.h:151
@ UNIT_MOD_HAPPINESS
Definition: Unit.h:153
@ UNIT_MOD_MANA
Definition: Unit.h:149
@ UNIT_MOD_RAGE
Definition: Unit.h:150
@ UNIT_MOD_RUNIC_POWER
Definition: Unit.h:155

References POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RUNE, and UNIT_MOD_RUNIC_POWER.

Referenced by HandleStatModifier().

◆ GetPPMProcChance()

float Unit::GetPPMProcChance ( uint32  WeaponSpeed,
float  PPM,
SpellInfo const *  spellProto 
) const
13438{
13439 // proc per minute chance calculation
13440 if (PPM <= 0)
13441 return 0.0f;
13442
13443 // Apply chance modifer aura
13444 if (spellProto)
13445 if (Player* modOwner = GetSpellModOwner())
13446 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_PROC_PER_MINUTE, PPM);
13447
13448 return std::floor((WeaponSpeed * PPM) / 600.0f); // result is chance in percents (probability = Speed_in_sec * (PPM / 60))
13449}
@ SPELLMOD_PROC_PER_MINUTE
Definition: SpellDefines.h:102

References GetSpellModOwner(), SpellInfo::Id, and SPELLMOD_PROC_PER_MINUTE.

Referenced by Player::CastItemCombatSpell(), and IsTriggeredAtSpellProcEvent().

◆ GetProcAurasTriggeredOnEvent()

void Unit::GetProcAurasTriggeredOnEvent ( std::list< AuraApplication * > &  aurasTriggeringProc,
std::list< AuraApplication * > *  procAuras,
ProcEventInfo  eventInfo 
)
16501{
16502 // use provided list of auras which can proc
16503 if (procAuras)
16504 {
16505 for (std::list<AuraApplication*>::iterator itr = procAuras->begin(); itr != procAuras->end(); ++itr)
16506 {
16507 ASSERT((*itr)->GetTarget() == this);
16508 if (!(*itr)->GetRemoveMode())
16509 if ((*itr)->GetBase()->IsProcTriggeredOnEvent(*itr, eventInfo))
16510 {
16511 (*itr)->GetBase()->PrepareProcToTrigger(*itr, eventInfo);
16512 aurasTriggeringProc.push_back(*itr);
16513 }
16514 }
16515 }
16516 // or generate one on our own
16517 else
16518 {
16519 for (AuraApplicationMap::iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16520 {
16521 if (itr->second->GetBase()->IsProcTriggeredOnEvent(itr->second, eventInfo))
16522 {
16523 itr->second->GetBase()->PrepareProcToTrigger(itr->second, eventInfo);
16524 aurasTriggeringProc.push_back(itr->second);
16525 }
16526 }
16527 }
16528}

References ASSERT, and GetAppliedAuras().

Referenced by TriggerAurasProcOnEvent().

◆ getRace()

uint8 Unit::getRace ( bool  original = false) const
20994{
20995 if (IsPlayer())
20996 {
20997 if (original)
20998 return m_realRace;
20999 else
21000 return m_race;
21001 }
21002
21004}

References Object::GetByteValue(), Object::IsPlayer(), m_race, m_realRace, and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), Player::BuildPlayerRepop(), Corpse::BuildValuesUpdate(), Player::CreateCorpse(), GetModelForForm(), GetModelForTotem(), getRaceMask(), GetReactionTo(), Player::GetStartPosition(), Player::GetTeamId(), Player::GiveLevel(), WorldSession::HandleAlterAppearance(), AuraEffect::HandleAuraTransform(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Creature::IsValidTrainerForPlayer(), Channel::KickOrBan(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), RestoreFaction(), Player::RewardHonor(), WorldSession::SendNameQueryOpcode(), Player::SetGameMaster(), Player::StoreNewItemInBestSlots(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getRaceMask()

◆ GetRandomContactPoint()

bool Unit::GetRandomContactPoint ( Unit const *  target,
float &  x,
float &  y,
float &  z,
bool  force = false 
) const
701{
702 float combat_reach = GetCombatReach();
703 if (combat_reach < 0.1f) // sometimes bugged for players
704 combat_reach = DEFAULT_COMBAT_REACH;
705
706 uint32 attacker_number = getAttackers().size();
707 if (attacker_number > 0)
708 --attacker_number;
709 Creature const* c = obj->ToCreature();
710 if (c)
711 if (c->isWorldBoss() || c->IsDungeonBoss() || (obj->IsPet() && const_cast<Unit*>(obj)->ToPet()->isControlled()))
712 attacker_number = 0; // pussywizard: pets and bosses just come to target from their angle
713
714 GetNearPoint(obj, x, y, z, isMoving() ? (obj->GetCombatReach() > 7.75f ? obj->GetCombatReach() - 7.5f : 0.25f) : obj->GetCombatReach(), 0.0f,
715 GetAngle(obj) + (attacker_number ? (static_cast<float>(M_PI / 2) - static_cast<float>(M_PI) * (float)rand_norm()) * float(attacker_number) / combat_reach * 0.3f : 0));
716
717 // pussywizard
718 if (std::fabs(this->GetPositionZ() - z) > this->GetCollisionHeight() || !IsWithinLOS(x, y, z))
719 {
720 x = this->GetPositionX();
721 y = this->GetPositionY();
722 z = this->GetPositionZ();
723 obj->UpdateAllowedPositionZ(x, y, z);
724 }
725 float maxDist = GetMeleeRange(obj);
726 if (GetExactDistSq(x, y, z) >= maxDist * maxDist)
727 {
728 if (force)
729 {
730 x = this->GetPositionX();
731 y = this->GetPositionY();
732 z = this->GetPositionZ();
733 return true;
734 }
735 return false;
736 }
737 return true;
738}
#define DEFAULT_COMBAT_REACH
Definition: ObjectDefines.h:46
bool IsDungeonBoss() const
Definition: Creature.cpp:3161
bool IsWithinLOS(float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
Definition: Object.cpp:1326
float GetExactDistSq(float x, float y, float z) const
Definition: Position.h:170
bool isControlled() const
Definition: Pet.h:54
float GetCollisionHeight() const override
Return collision height sent to client.
Definition: Unit.cpp:21093
float GetMeleeRange(Unit const *target) const
Definition: Unit.cpp:679

References DEFAULT_COMBAT_REACH, Position::GetAngle(), getAttackers(), GetCollisionHeight(), GetCombatReach(), Position::GetExactDistSq(), GetMeleeRange(), WorldObject::GetNearPoint(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Pet::isControlled(), Creature::IsDungeonBoss(), isMoving(), IsPet(), WorldObject::IsWithinLOS(), Creature::isWorldBoss(), rand_norm(), Object::ToCreature(), ToPet(), and WorldObject::UpdateAllowedPositionZ().

Referenced by boss_bug_trio::DamageTaken(), and boss_bug_trio::DoFinalSpell().

◆ GetRangedCritChanceReduction()

float Unit::GetRangedCritChanceReduction ( ) const
inline

◆ GetRangedCritDamageReduction()

uint32 Unit::GetRangedCritDamageReduction ( uint32  damage) const
inline

◆ GetRangedDamageReduction()

uint32 Unit::GetRangedDamageReduction ( uint32  damage) const
inline

◆ GetReactionTo()

ReputationRank Unit::GetReactionTo ( Unit const *  target,
bool  checkOriginalFaction = false 
) const
10056{
10057 // always friendly to self
10058 if (this == target)
10059 return REP_FRIENDLY;
10060
10061 // always friendly to charmer or owner
10063 return REP_FRIENDLY;
10064
10065 Player const* selfPlayerOwner = GetAffectingPlayer();
10066 Player const* targetPlayerOwner = target->GetAffectingPlayer();
10067
10068 // check forced reputation to support SPELL_AURA_FORCE_REACTION
10069 if (selfPlayerOwner)
10070 {
10071 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10072 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10073 return *repRank;
10074 }
10075 else if (targetPlayerOwner)
10076 {
10077 if (FactionTemplateEntry const* selfFactionTemplateEntry = GetFactionTemplateEntry())
10078 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(selfFactionTemplateEntry))
10079 return *repRank;
10080 }
10081
10083 {
10084 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
10085 {
10086 if (selfPlayerOwner && targetPlayerOwner)
10087 {
10088 // always friendly to other unit controlled by player, or to the player himself
10089 if (selfPlayerOwner == targetPlayerOwner)
10090 return REP_FRIENDLY;
10091
10092 // duel - always hostile to opponent
10093 if (selfPlayerOwner->duel && selfPlayerOwner->duel->Opponent == targetPlayerOwner && selfPlayerOwner->duel->State == DUEL_STATE_IN_PROGRESS)
10094 return REP_HOSTILE;
10095
10096 // same group - checks dependant only on our faction - skip FFA_PVP for example
10097 if (selfPlayerOwner->IsInRaidWith(targetPlayerOwner))
10098 return REP_FRIENDLY; // return true to allow config option AllowTwoSide.Interaction.Group to work
10099 // however client seems to allow mixed group parties, because in 13850 client it works like:
10100 // return GetFactionReactionTo(GetFactionTemplateEntry(), target);
10101 }
10102
10103 // check FFA_PVP
10104 if (IsFFAPvP() && target->IsFFAPvP())
10105 return REP_HOSTILE;
10106
10107 if (selfPlayerOwner)
10108 {
10109 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10110 {
10111 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10112 return *repRank;
10113 if (!selfPlayerOwner->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10114 {
10115 if (FactionEntry const* targetFactionEntry = sFactionStore.LookupEntry(targetFactionTemplateEntry->faction))
10116 {
10117 if (targetFactionEntry->CanHaveReputation())
10118 {
10119 // check contested flags
10120 if (targetFactionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10121 && selfPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10122 return REP_HOSTILE;
10123
10124 // if faction has reputation, hostile state depends only from AtWar state
10125 if (selfPlayerOwner->GetReputationMgr().IsAtWar(targetFactionEntry))
10126 return REP_HOSTILE;
10127 return REP_FRIENDLY;
10128 }
10129 }
10130 }
10131 }
10132 }
10133 }
10134 }
10135
10136 ReputationRank repRank = REP_HATED;
10137 if (!sScriptMgr->IfNormalReaction(this, target, repRank))
10138 {
10139 return ReputationRank(repRank);
10140 }
10141
10142 FactionTemplateEntry const* factionTemplateEntry = nullptr;
10143 if (checkOriginalFaction)
10144 {
10145 if (IsPlayer())
10146 {
10147 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(getRace()))
10148 {
10149 factionTemplateEntry = sFactionTemplateStore.LookupEntry(rEntry->FactionID);
10150 }
10151 }
10152 else
10153 {
10154 Unit* owner = GetOwner();
10155 if (HasUnitTypeMask(UNIT_MASK_MINION) && owner)
10156 {
10157 factionTemplateEntry = sFactionTemplateStore.LookupEntry(owner->GetFaction());
10158 }
10159 else if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate())
10160 {
10161 factionTemplateEntry = sFactionTemplateStore.LookupEntry(cinfo->faction);
10162 }
10163 }
10164 }
10165
10166 if (!factionTemplateEntry)
10167 {
10168 factionTemplateEntry = GetFactionTemplateEntry();
10169 }
10170
10171 // do checks dependant only on our faction
10172 return GetFactionReactionTo(factionTemplateEntry, target);
10173}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
@ REP_HATED
Definition: SharedDefines.h:180
bool HasPlayerFlag(PlayerFlags flags) const
Definition: Player.h:1108
ReputationRank GetFactionReactionTo(FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
Definition: Unit.cpp:10175
bool IsInRaidWith(Unit const *unit) const
Definition: Unit.cpp:18784
bool IsAtWar(uint32 faction_id) const
Definition: ReputationMgr.cpp:55
Definition: DBCStructure.h:678

References Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, GetAffectingPlayer(), GetCharmerOrOwnerOrSelf(), GetFaction(), GetFactionReactionTo(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetOwner(), getRace(), Player::GetReputationMgr(), Player::HasPlayerFlag(), HasUnitFlag(), HasUnitFlag2(), HasUnitTypeMask(), ReputationMgr::IsAtWar(), IsFFAPvP(), IsInRaidWith(), Object::IsPlayer(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HATED, REP_HOSTILE, sChrRacesStore, sFactionStore, sFactionTemplateStore, sScriptMgr, Object::ToCreature(), UNIT_FLAG2_IGNORE_REPUTATION, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_MINION.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), Player::GetNPCIfCanInteractWith(), IsFriendlyTo(), IsHostileTo(), and Condition::Meets().

◆ GetRedirectThreatPercent()

uint32 Unit::GetRedirectThreatPercent ( )
inline
uint32 GetThreatPct() const
Definition: ThreatMgr.h:300

References _redirectThreatInfo, and RedirectThreatInfo::GetThreatPct().

Referenced by ThreatMgr::DoAddThreat().

◆ GetRedirectThreatTarget()

Unit * Unit::GetRedirectThreatTarget ( ) const

◆ GetResistance() [1/2]

uint32 Unit::GetResistance ( SpellSchoolMask  mask) const
20321{
20322 int32 resist = -1;
20323 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
20324 if (mask & (1 << i) && (resist < 0 || resist > int32(GetResistance(SpellSchools(i)))))
20325 resist = int32(GetResistance(SpellSchools(i)));
20326
20327 // resist value will never be negative here
20328 return uint32(resist);
20329}

References GetResistance(), MAX_SPELL_SCHOOL, and SPELL_SCHOOL_NORMAL.

◆ GetResistance() [2/2]

uint32 Unit::GetResistance ( SpellSchools  school) const
inline
864{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_RESISTANCES) + school); }
@ UNIT_FIELD_RESISTANCES
Definition: UpdateFields.h:156

References Object::GetUInt32Value(), and UNIT_FIELD_RESISTANCES.

Referenced by Player::_SaveStats(), GetArmor(), GetEffectiveResistChance(), GetResistance(), and Player::outDebugValues().

◆ GetResistanceBuffMods()

float Unit::GetResistanceBuffMods ( SpellSchools  school,
bool  positive 
) const
inline

◆ GetShapeshiftForm()

◆ GetSharedVisionList()

◆ GetSheath()

SheathState Unit::GetSheath ( ) const
inline
SheathState
Definition: UnitDefines.h:104

References Object::GetByteValue(), and UNIT_FIELD_BYTES_2.

◆ GetShieldBlockValue() [1/2]

virtual uint32 Unit::GetShieldBlockValue ( ) const
pure virtual

◆ GetShieldBlockValue() [2/2]

uint32 Unit::GetShieldBlockValue ( uint32  soft_cap,
uint32  hard_cap 
) const
inline
1083 {
1084 uint32 value = GetShieldBlockValue();
1085 if (value >= hard_cap)
1086 {
1087 value = (soft_cap + hard_cap) / 2;
1088 }
1089 else if (value > soft_cap)
1090 {
1091 value = soft_cap + ((value - soft_cap) / 2);
1092 }
1093
1094 return value;
1095 }

References GetShieldBlockValue().

◆ GetSingleCastAuras() [1/2]

AuraList & Unit::GetSingleCastAuras ( )
inline

◆ GetSingleCastAuras() [2/2]

AuraList const & Unit::GetSingleCastAuras ( ) const
inline
1376{ return m_scAuras; }

References m_scAuras.

◆ GetSpeed()

◆ GetSpeedRate()

◆ GetSpellCritChanceReduction()

float Unit::GetSpellCritChanceReduction ( ) const
inline

◆ GetSpellCritDamageReduction()

◆ GetSpellDamageReduction()

uint32 Unit::GetSpellDamageReduction ( uint32  damage) const
inline

◆ GetSpellMaxRangeForTarget()

float Unit::GetSpellMaxRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15134{
15135 if (!spellInfo->RangeEntry)
15136 {
15137 return 0;
15138 }
15139
15140 if (spellInfo->RangeEntry->RangeMax[1] == spellInfo->RangeEntry->RangeMax[0])
15141 {
15142 return spellInfo->GetMaxRange();
15143 }
15144
15145 if (!target)
15146 {
15147 return spellInfo->GetMaxRange(true);
15148 }
15149
15150 return spellInfo->GetMaxRange(!IsHostileTo(target));
15151}

References SpellInfo::GetMaxRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMax.

Referenced by spell_sha_fire_nova::CheckFireTotem(), Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), ScriptedAI::SelectSpell(), GameObject::TriggeringLinkedGameObject(), and Pet::Update().

◆ GetSpellMinRangeForTarget()

float Unit::GetSpellMinRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15154{
15155 if (!spellInfo->RangeEntry)
15156 {
15157 return 0;
15158 }
15159
15160 if (spellInfo->RangeEntry->RangeMin[1] == spellInfo->RangeEntry->RangeMin[0])
15161 {
15162 return spellInfo->GetMinRange();
15163 }
15164
15165 return spellInfo->GetMinRange(!IsHostileTo(target));
15166}

References SpellInfo::GetMinRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMin.

Referenced by Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), and ScriptedAI::SelectSpell().

◆ GetSpellModOwner()

Player * Unit::GetSpellModOwner ( ) const
16565{
16566 if (Player* player = const_cast<Unit*>(this)->ToPlayer())
16567 {
16568 return player;
16569 }
16570
16571 if (Unit* owner = GetOwner())
16572 {
16573 if (Player* player = owner->ToPlayer())
16574 {
16575 return player;
16576 }
16577 }
16578
16579 // Special handling for Eye of Kilrogg
16581 {
16582 if (TempSummon const* tempSummon = ToTempSummon())
16583 {
16584 if (Unit* summoner = tempSummon->GetSummonerUnit())
16585 {
16586 return summoner->ToPlayer();
16587 }
16588 }
16589 }
16590
16591 return nullptr;
16592}
@ NPC_EYE_OF_KILROGG
Definition: PetDefines.h:101
Definition: TemporarySummon.h:40

References Object::GetEntry(), GetOwner(), NPC_EYE_OF_KILROGG, Object::ToPlayer(), and ToTempSummon().

Referenced by Spell::_cast(), Creature::AddSpellCooldown(), ApplyEffectModifiers(), CalcArmorReducedDamage(), SpellEffectInfo::CalcDamageMultiplier(), Aura::CalcDispelChance(), Aura::CalcMaxCharges(), Aura::CalcMaxDuration(), AuraEffect::CalcPeriodicCritChance(), SpellInfo::CalcPowerCost(), Aura::CalcProcChance(), SpellEffectInfo::CalcRadius(), ThreatCalcHelper::calcThreat(), spell_dru_brambles_treant::CalculateAmount(), AuraEffect::CalculatePeriodic(), CalculateSpellDamageTaken(), SpellEffectInfo::CalcValueMultiplier(), Spell::cancel(), Spell::cast(), Spell::CheckRange(), Spell::CheckRuneCost(), Spell::EffectSummonPet(), Spell::EffectSummonType(), Spell::finish(), GetEffectiveResistChance(), SpellInfo::GetMaxRange(), GetPPMProcChance(), Spell::handle_delayed(), Spell::handle_immediate(), IsAlwaysDetectableFor(), SpellInfo::IsStrongerAuraActive(), IsTriggeredAtSpellProcEvent(), MagicSpellHitResult(), MeleeDamageBonusDone(), MeleeSpellMissChance(), ModSpellCastTime(), Spell::SelectImplicitChainTargets(), Aura::SetDuration(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), SpellHealingBonusDone(), Spell::SummonGuardian(), Spell::TakePower(), Spell::TakeRunePower(), Spell::UpdateChanneledTargetList(), and Aura::UpdateOwner().

◆ GetSpellSchoolByAuraGroup()

SpellSchools Unit::GetSpellSchoolByAuraGroup ( UnitMods  unitMod) const
15332{
15334
15335 switch (unitMod)
15336 {
15338 school = SPELL_SCHOOL_HOLY;
15339 break;
15341 school = SPELL_SCHOOL_FIRE;
15342 break;
15344 school = SPELL_SCHOOL_NATURE;
15345 break;
15347 school = SPELL_SCHOOL_FROST;
15348 break;
15350 school = SPELL_SCHOOL_SHADOW;
15351 break;
15353 school = SPELL_SCHOOL_ARCANE;
15354 break;
15355
15356 default:
15357 break;
15358 }
15359
15360 return school;
15361}
@ UNIT_MOD_RESISTANCE_SHADOW
Definition: Unit.h:161
@ UNIT_MOD_RESISTANCE_FROST
Definition: Unit.h:160
@ UNIT_MOD_RESISTANCE_HOLY
Definition: Unit.h:157
@ UNIT_MOD_RESISTANCE_ARCANE
Definition: Unit.h:162
@ UNIT_MOD_RESISTANCE_FIRE
Definition: Unit.h:158
@ UNIT_MOD_RESISTANCE_NATURE
Definition: Unit.h:159
@ SPELL_SCHOOL_SHADOW
Definition: SharedDefines.h:288
@ SPELL_SCHOOL_NATURE
Definition: SharedDefines.h:286
@ SPELL_SCHOOL_FROST
Definition: SharedDefines.h:287
@ SPELL_SCHOOL_ARCANE
Definition: SharedDefines.h:289
@ SPELL_SCHOOL_FIRE
Definition: SharedDefines.h:285
@ SPELL_SCHOOL_HOLY
Definition: SharedDefines.h:284

References SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, and UNIT_MOD_RESISTANCE_SHADOW.

Referenced by HandleStatModifier().

◆ getStandState()

◆ GetStat()

◆ GetStatByAuraGroup()

Stats Unit::GetStatByAuraGroup ( UnitMods  unitMod) const
15364{
15365 Stats stat = STAT_STRENGTH;
15366
15367 switch (unitMod)
15368 {
15370 stat = STAT_STRENGTH;
15371 break;
15373 stat = STAT_AGILITY;
15374 break;
15376 stat = STAT_STAMINA;
15377 break;
15379 stat = STAT_INTELLECT;
15380 break;
15382 stat = STAT_SPIRIT;
15383 break;
15384
15385 default:
15386 break;
15387 }
15388
15389 return stat;
15390}
@ UNIT_MOD_STAT_INTELLECT
Definition: Unit.h:146
@ UNIT_MOD_STAT_SPIRIT
Definition: Unit.h:147
@ UNIT_MOD_STAT_STRENGTH
Definition: Unit.h:143
@ UNIT_MOD_STAT_AGILITY
Definition: Unit.h:144
@ UNIT_MOD_STAT_STAMINA
Definition: Unit.h:145
Stats
Definition: SharedDefines.h:257
@ STAT_SPIRIT
Definition: SharedDefines.h:262
@ STAT_INTELLECT
Definition: SharedDefines.h:261
@ STAT_AGILITY
Definition: SharedDefines.h:259
@ STAT_STRENGTH
Definition: SharedDefines.h:258
@ STAT_STAMINA
Definition: SharedDefines.h:260

References STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by HandleStatModifier().

◆ GetTarget()

◆ GetThreatMgr() [1/2]

ThreatMgr & Unit::GetThreatMgr ( )
inline
839{ return m_ThreatMgr; }

References m_ThreatMgr.

Referenced by CreatureAI::_EnterEvadeMode(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_razorgore::boss_razorgoreAI::CanAIAttack(), boss_hazzarah::CanAIAttack(), boss_jindo::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_nethermancer_sepethrea::CanAIAttack(), boss_mor_grayhoof::CastRandomSpell(), CleanupBeforeRemoveFromMap(), boss_kiljaeden::boss_kiljaedenAI::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), npc_magister_aledis::DamageTaken(), boss_ysondre::boss_ysondreAI::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), ScriptedAI::DoAddThreat(), UnitAI::DoCastToAllHostilePlayers(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoGetThreat(), ScriptedAI::DoModifyThreatByPercent(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), ScriptedAI::DoResetThreat(), ScriptedAI::DoResetThreatList(), Spell::EffectModifyThreatPercent(), Spell::EffectTaunt(), boss_faction_championsAI::EnemiesInRange(), boss_ragnaros::boss_ragnarosAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), boss_murmur::EnterEvadeMode(), boss_alar::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), boss_ouro::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), TemporaryThreatModifierEvent::Execute(), StartMovementEvent::Execute(), boss_supremus::FindHatefulStrikeTarget(), npc_raging_flames::FixateRandomTarget(), SmartScript::GetTargets(), UnitAI::GetThreatMgr(), debug_commandscript::HandleDebugThreatListCommand(), spell_karazhan_blink::HandleDummy(), spell_kaelthas_mind_control::HandleEffect(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_enveloping_webs::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), HandleProcTriggerSpell(), PetAI::HandleReturnMovement(), spell_pursue::HandleScript(), spell_gurtogg_eject::HandleScriptEffect(), spell_leotheras_whirlwind::HandleScriptEffect(), boss_attumen::IsSummonedBy(), boss_blackheart_the_inciter::JustEngagedWith(), boss_jindo::JustSummoned(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), Creature::ModifyThreatPercentTemp(), boss_bug_trio::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), NonTankTargetSelector::operator()(), StoneGripTargetSelector::operator()(), boss_jeklik::PathEndReached(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), boss_talon_king_ikiss::Reset(), boss_faction_championsAI::SelectEnemyCaster(), npc_scholomance_occultist::npc_scholomance_occultistAI::SelectUnitCasting(), SendChangeCurrentVictimOpcode(), SendThreatListUpdate(), setDeathState(), SetPhaseMask(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), boss_ouro::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), BossAI::TeleportCheaters(), Creature::Update(), Update(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_nefarian::UpdateAI(), boss_yazzai::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), boss_taldaram::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), boss_netherspite::UpdatePortals(), and CreatureAI::UpdateVictim().

◆ GetThreatMgr() [2/2]

ThreatMgr const & Unit::GetThreatMgr ( ) const
inline
840{ return m_ThreatMgr; }

References m_ThreatMgr.

◆ GetTotalAttackPowerValue()

float Unit::GetTotalAttackPowerValue ( WeaponAttackType  attType,
Unit pVictim = nullptr 
) const
15415{
15416 if (attType == RANGED_ATTACK)
15417 {
15419 if (victim)
15420 ap += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
15421
15422 if (ap < 0)
15423 return 0.0f;
15425 }
15426 else
15427 {
15429 if (victim)
15430 ap += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
15431
15432 if (ap < 0)
15433 return 0.0f;
15435 }
15436}
@ SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS
Definition: SpellAuraDefines.h:190
@ SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS
Definition: SpellAuraDefines.h:228
@ UNIT_FIELD_ATTACK_POWER_MODS
Definition: UpdateFields.h:163
@ UNIT_FIELD_RANGED_ATTACK_POWER
Definition: UpdateFields.h:165
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:167
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:164
@ UNIT_FIELD_ATTACK_POWER
Definition: UpdateFields.h:162
@ UNIT_FIELD_RANGED_ATTACK_POWER_MODS
Definition: UpdateFields.h:166
int32 GetInt32Value(uint16 index) const
Definition: Object.cpp:299

References Object::GetFloatValue(), Object::GetInt32Value(), GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, and UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER.

Referenced by spell_dk_ghoul_thrash::CalcDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_execute::HandleEffect(), spell_pal_seal_of_righteousness::HandleProc(), HandleProcTriggerSpell(), Spell::HandleThreatSpells(), Guardian::InitStatsForLevel(), SpellBaseDamageBonusDone(), SpellBaseHealingBonusDone(), SpellDamageBonusDone(), SpellHealingBonusDone(), Guardian::UpdateDamagePhysical(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetTotalAuraModifier()

◆ GetTotalAuraModifierAreaExclusive()

int32 Unit::GetTotalAuraModifierAreaExclusive ( AuraType  auratype) const
5891{
5892 int32 modifier = 0;
5893 int32 areaModifier = 0;
5894
5895 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5896 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5897 {
5898 if ((*i)->GetSpellInfo()->HasAreaAuraEffect())
5899 {
5900 if (areaModifier < (*i)->GetAmount())
5901 areaModifier = (*i)->GetAmount();
5902 }
5903 else
5904 modifier += (*i)->GetAmount();
5905 }
5906
5907 return modifier + areaModifier;
5908}

References GetAuraEffectsByType().

Referenced by Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByAffectMask()

int32 Unit::GetTotalAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6067{
6068 int32 modifier = 0;
6069
6070 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6071 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6072 if ((*i)->IsAffectedOnSpell(affectedSpell))
6073 modifier += (*i)->GetAmount();
6074
6075 return modifier;
6076}

References GetAuraEffectsByType().

◆ GetTotalAuraModifierByMiscMask()

int32 Unit::GetTotalAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
5962{
5963 int32 modifier = 0;
5964
5965 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5966 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5967 {
5968 if ((*i)->GetMiscValue()& misc_mask)
5969 modifier += (*i)->GetAmount();
5970 }
5971 return modifier;
5972}

References GetAuraEffectsByType().

Referenced by CalcArmorReducedDamage(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), GetEffectiveResistChance(), MagicSpellHitResult(), SpellCriticalDamageBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), and Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByMiscValue()

int32 Unit::GetTotalAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6015{
6016 int32 modifier = 0;
6017
6018 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6019 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6020 if ((*i)->GetMiscValue() == misc_value)
6021 modifier += (*i)->GetAmount();
6022
6023 return modifier;
6024}

References GetAuraEffectsByType().

Referenced by Player::CalculateReputationGain(), GetMechanicResistChance(), MeleeSpellHitResult(), ModSpellDuration(), Creature::Regenerate(), Player::Regenerate(), RollMeleeOutcomeAgainst(), and Player::UpdateManaRegen().

◆ GetTotalAuraModValue()

float Unit::GetTotalAuraModValue ( UnitMods  unitMod) const
15305{
15306 if (unitMod >= UNIT_MOD_END)
15307 {
15308 LOG_ERROR("entities.unit", "attempt to access non-existing UnitMods in GetTotalAuraModValue()!");
15309 return 0.0f;
15310 }
15311
15312 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15313 return 0.0f;
15314
15315 float value = m_auraModifiersGroup[unitMod][BASE_VALUE];
15316 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15317 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE];
15318 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15319
15320 return value;
15321}

References BASE_PCT, BASE_VALUE, LOG_ERROR, m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_END.

Referenced by Creature::UpdateArmor(), Creature::UpdateMaxHealth(), Creature::UpdateMaxPower(), and Creature::UpdateResistances().

◆ GetTotalAuraMultiplier()

float Unit::GetTotalAuraMultiplier ( AuraType  auratype) const
5925{
5926 float multiplier = 1.0f;
5927
5928 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5929 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5930 AddPct(multiplier, (*i)->GetAmount());
5931
5932 return multiplier;
5933}

References AddPct(), and GetAuraEffectsByType().

Referenced by MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), SpellCriticalHealingBonus(), and UpdateSpeed().

◆ GetTotalAuraMultiplierByAffectMask()

float Unit::GetTotalAuraMultiplierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6079{
6080 float multiplier = 1.0f;
6081
6082 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6083 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6084 if ((*i)->IsAffectedOnSpell(affectedSpell))
6085 AddPct(multiplier, (*i)->GetAmount());
6086
6087 return multiplier;
6088}

References AddPct(), and GetAuraEffectsByType().

◆ GetTotalAuraMultiplierByMiscMask()

float Unit::GetTotalAuraMultiplierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
5975{
5976 float multiplier = 1.0f;
5977
5978 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5979 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5980 if (((*i)->GetMiscValue() & misc_mask))
5981 AddPct(multiplier, (*i)->GetAmount());
5982
5983 return multiplier;
5984}

References AddPct(), and GetAuraEffectsByType().

Referenced by CalculateAOEDamageReduction(), CalculateMeleeDamage(), MeleeDamageBonusTaken(), and SpellCriticalHealingBonus().

◆ GetTotalAuraMultiplierByMiscValue()

float Unit::GetTotalAuraMultiplierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6027{
6028 float multiplier = 1.0f;
6029
6030 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6031 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6032 if ((*i)->GetMiscValue() == misc_value)
6033 AddPct(multiplier, (*i)->GetAmount());
6034
6035 return multiplier;
6036}

References AddPct(), and GetAuraEffectsByType().

Referenced by Player::UpdateManaRegen().

◆ GetTotalStatValue()

float Unit::GetTotalStatValue ( Stats  stat,
float  additionalValue = 0.0f 
) const
15289{
15290 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_STAT_START) + stat);
15291
15292 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15293 return 0.0f;
15294
15295 // value = ((base_value * base_pct) + total_value) * total_pct
15296 float value = m_auraModifiersGroup[unitMod][BASE_VALUE] + GetCreateStat(stat);
15297 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15298 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE] + additionalValue;
15299 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15300
15301 return value;
15302}
UnitMods
Definition: Unit.h:142
@ UNIT_MOD_STAT_START
Definition: Unit.h:170
float GetCreateStat(Stats stat) const
Definition: Unit.h:1452

References BASE_PCT, BASE_VALUE, GetCreateStat(), m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_STAT_START.

Referenced by Player::UpdateAllStats(), Guardian::UpdateStats(), and Player::UpdateStats().

◆ getTransForm()

◆ GetTransGUID()

◆ GetUnitBlockChance()

float Unit::GetUnitBlockChance ( ) const
3703{
3704 if (Player const* player = ToPlayer())
3705 {
3706 if (player->CanBlock())
3707 {
3708 Item* tmpitem = player->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
3709 if (tmpitem && !tmpitem->IsBroken() && tmpitem->GetTemplate()->Block)
3711 }
3712 // is player but has no block ability or no not broken shield equipped
3713 return 0.0f;
3714 }
3715 else
3716 {
3717 if (ToCreature()->IsTotem())
3718 return 0.0f;
3719 else
3720 {
3721 float block = 5.0f;
3723 return block > 0.0f ? block : 0.0f;
3724 }
3725 }
3726}
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition: SpellAuraDefines.h:114
@ EQUIPMENT_SLOT_OFFHAND
Definition: Player.h:691
#define INVENTORY_SLOT_BAG_0
Definition: Player.h:670
@ PLAYER_BLOCK_PERCENTAGE
Definition: UpdateFields.h:346
ItemTemplate const * GetTemplate() const
Definition: Item.cpp:545
bool IsBroken() const
Definition: Item.h:257
uint32 Block
Definition: ItemTemplate.h:674

References ItemTemplate::Block, EQUIPMENT_SLOT_OFFHAND, Object::GetFloatValue(), Item::GetTemplate(), GetTotalAuraModifier(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), IsTotem(), PLAYER_BLOCK_PERCENTAGE, SPELL_AURA_MOD_BLOCK_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitCriticalChance()

float Unit::GetUnitCriticalChance ( WeaponAttackType  attackType,
Unit const *  victim 
) const
3729{
3730 float crit;
3731
3732 if (IsPlayer())
3733 {
3734 switch (attackType)
3735 {
3736 case BASE_ATTACK:
3738 break;
3739 case OFF_ATTACK:
3741 break;
3742 case RANGED_ATTACK:
3744 break;
3745 // Just for good manner
3746 default:
3747 crit = 0.0f;
3748 break;
3749 }
3750 }
3751 else
3752 {
3753 crit = 5.0f;
3756 }
3757
3758 // flat aura mods
3759 if (attackType == RANGED_ATTACK)
3760 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE);
3761 else
3762 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE);
3763
3764 AuraEffectList const& mTotalAuraList = victim->GetAuraEffectsByType(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER);
3765 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
3766 {
3767 if (GetGUID() != (*i)->GetCasterGUID())
3768 continue;
3769
3770 crit += (*i)->GetAmount();
3771 }
3772
3773 // reduce crit chance from Rating for players
3774 if (attackType != RANGED_ATTACK)
3775 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_MELEE);
3776 else
3777 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_RANGED);
3778
3779 // Apply crit chance from defence skill
3780 crit += (int32(GetMaxSkillValueForLevel(victim)) - int32(victim->GetDefenseSkillValue(this))) * 0.04f;
3781
3782 // xinef: SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE should be calculated at the end
3783 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
3784
3785 if (crit < 0.0f)
3786 crit = 0.0f;
3787 return crit;
3788}
@ SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER
Definition: SpellAuraDefines.h:371
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE
Definition: SpellAuraDefines.h:251
@ SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
Definition: SpellAuraDefines.h:260
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE
Definition: SpellAuraDefines.h:250
@ SPELL_AURA_MOD_CRIT_PCT
Definition: SpellAuraDefines.h:353
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition: SpellAuraDefines.h:115
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition: UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition: UpdateFields.h:351
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition: UpdateFields.h:353
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition: Unit.h:995

References ApplyResilience(), BASE_ATTACK, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, GetAuraEffectsByType(), GetDefenseSkillValue(), Object::GetFloatValue(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), Object::IsPlayer(), OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_MOD_CRIT_PCT, and SPELL_AURA_MOD_WEAPON_CRIT_PERCENT.

Referenced by spell_dk_wandering_plague_aura::CheckProc(), and RollMeleeOutcomeAgainst().

◆ GetUnitDodgeChance()

float Unit::GetUnitDodgeChance ( ) const
3641{
3642 if (IsPlayer())
3643 return ToPlayer()->GetRealDodge(); //GetFloatValue(PLAYER_DODGE_PERCENTAGE);
3644 else
3645 {
3646 if (ToCreature()->IsTotem())
3647 return 0.0f;
3648 else
3649 {
3650 float dodge = ToCreature()->isWorldBoss() ? 5.85f : 5.0f; // Xinef: bosses should have 6.5% dodge (5.9 + 0.6 from defense skill difference)
3652 return dodge > 0.0f ? dodge : 0.0f;
3653 }
3654 }
3655}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition: SpellAuraDefines.h:112
float GetRealDodge() const
Definition: Player.h:2590

References Player::GetRealDodge(), GetTotalAuraModifier(), Object::IsPlayer(), IsTotem(), Creature::isWorldBoss(), SPELL_AURA_MOD_DODGE_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitFlags()

◆ GetUnitFlags2()

UnitFlags2 Unit::GetUnitFlags2 ( ) const
inline

Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.

UnitFlags2
Definition: UnitDefines.h:266
@ UNIT_FIELD_FLAGS_2
Definition: UpdateFields.h:118

References Object::GetUInt32Value(), and UNIT_FIELD_FLAGS_2.

Referenced by npc_commandscript::HandleNpcInfoCommand().

◆ GetUnitMeleeSkill()

uint32 Unit::GetUnitMeleeSkill ( Unit const *  target = nullptr) const
inline
1097{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }

References GetLevel(), and getLevelForTarget().

Referenced by DealMeleeDamage(), GetDefenseSkillValue(), and GetWeaponSkillValue().

◆ GetUnitMissChance()

float Unit::GetUnitMissChance ( WeaponAttackType  attType) const
3688{
3689 float miss_chance = 5.00f;
3690
3691 if (Player const* player = ToPlayer())
3692 miss_chance += player->GetMissPercentageFromDefence();
3693
3694 if (attType == RANGED_ATTACK)
3696 else
3698
3699 return miss_chance;
3700}
@ SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE
Definition: SpellAuraDefines.h:247
@ SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE
Definition: SpellAuraDefines.h:248

References GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE, and Object::ToPlayer().

Referenced by MeleeSpellMissChance().

◆ GetUnitMovementFlags()

◆ GetUnitParryChance()

float Unit::GetUnitParryChance ( ) const
3658{
3659 float chance = 0.0f;
3660
3661 if (Player const* player = ToPlayer())
3662 {
3663 if (player->CanParry())
3664 {
3665 Item* tmpitem = player->GetWeaponForAttack(BASE_ATTACK, true);
3666 if (!tmpitem)
3667 tmpitem = player->GetWeaponForAttack(OFF_ATTACK, true);
3668
3669 if (tmpitem)
3670 chance = player->GetRealParry(); //GetFloatValue(PLAYER_PARRY_PERCENTAGE);
3671 }
3672 }
3673 else if (IsCreature())
3674 {
3675 if (ToCreature()->isWorldBoss())
3676 chance = 13.4f; // + 0.6 by skill diff
3678 chance = 5.0f;
3679
3680 // Xinef: if aura is present, type should not matter
3682 }
3683
3684 return chance > 0.0f ? chance : 0.0f;
3685}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition: SpellAuraDefines.h:110

References BASE_ATTACK, CREATURE_TYPE_HUMANOID, GetCreatureType(), GetTotalAuraModifier(), Object::IsCreature(), OFF_ATTACK, SPELL_AURA_MOD_PARRY_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by spell_dk_spell_deflection::Absorb(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitState()

uint32 Unit::GetUnitState ( ) const
inline

◆ GetUnitTypeMask()

uint32 Unit::GetUnitTypeMask ( ) const
inline
679{ return m_unitTypeMask; }

References m_unitTypeMask.

◆ GetVehicle()

Vehicle * Unit::GetVehicle ( ) const
inline
1687{ return m_vehicle; }

References m_vehicle.

Referenced by KillRewarder::_InitXP(), Vehicle::AddPassenger(), WorldSession::BuildPartyMemberStatsChangedPacket(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::CanAIAttack(), npc_raging_spirit::npc_raging_spiritAI::CanAIAttack(), npc_icc_lk_checktarget::npc_icc_lk_checktargetAI::CanAIAttack(), boss_flame_leviathan_defense_turret::boss_flame_leviathan_defense_turretAI::CanAIAttack(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::CheckAchievementCriteriaMeet(), Spell::CheckCast(), Spell::EffectJumpDest(), Spell::EffectKnockBack(), CreatureAI::EnterEvadeMode(), GetDirectTransport(), SmartScript::GetTargets(), GetTransGUID(), WorldSession::HandleAttackSwingOpcode(), WorldSession::HandleChangeSeatsOnControlledVehicle(), spell_switch_infragreen_bomber_station::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), Player::IsPetNeedBeTemporaryUnsummoned(), npc_nexus_lord::npc_nexus_lordAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), achievement_flame_leviathan_garage::OnCheck(), achievement_wg_didnt_stand_a_chance::OnCheck(), npc_announcer_toc5::OnGossipHello(), BattlefieldWG::OnPlayerLeaveWar(), boss_flame_leviathan_overload_device::boss_flame_leviathan_overload_deviceAI::OnSpellClick(), VehicleCheck::operator()(), OutDebugInfo(), Player::ProcessDelayedOperations(), Player::ProcessTerrainStatusUpdate(), Vehicle::RemovePassenger(), Creature::SelectVictim(), SetControlled(), Player::SetViewpoint(), lfg::LFGMgr::TeleportPlayer(), npc_pilgrims_bounty_chair::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_impaling_spear::npc_impaling_spearAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdatePosition(), UpdateSpeed(), GameObject::Use(), Acore::MessageDistDeliverer::Visit(), and Acore::MessageDistDelivererToHostile::Visit().

◆ GetVehicleBase()

◆ GetVehicleCreatureBase()

◆ GetVehicleKit()

Vehicle * Unit::GetVehicleKit ( ) const
inline
1686{ return m_vehicleKit; }

References m_vehicleKit.

Referenced by _EnterVehicle(), Creature::AddToWorld(), Creature::AIM_Initialize(), boss_xt002::boss_xt002AI::AttachHeart(), npc_salvaged_siege_engine::BeforeSpellClick(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::boss_deathbringer_saurfangAI(), spell_igb_cannon_blast::CalculatePower(), Aura::CanStackWith(), spell_demolisher_ride_vehicle::CheckCast(), SmartAI::CheckConditions(), VehicleAI::CheckConditions(), Map::CreatureRelocation(), Dismount(), npc_orb_carrier::npc_orb_carrierAI::DoAction(), npc_ulduar_vx001::npc_ulduar_vx001AI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), Spell::EffectTeleportUnits(), CreatureAI::EnterEvadeMode(), boss_ick::boss_ickAI::GetKrick(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::GetS3(), SmartScript::GetTargets(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraSetVehicle(), WorldSession::HandleCastSpellOpcode(), spell_q13280_13283_plant_battle_standard::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_q12919_gymers_throw::HandleScript(), HandleSpellClick(), IsOnVehicle(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), GameObject::IsWithinDistInMap(), boss_gormok::boss_gormokAI::JustEngagedWith(), Mount(), npc_hover_disk::npc_hover_diskAI::MovementInform(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::MovementInform(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::MovementInform(), npc_vics_flying_machine::npc_vics_flying_machineAI::MovementInform(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::npc_high_overlord_saurfangAI(), npc_orb_carrier::npc_orb_carrierAI::npc_orb_carrierAI(), spell_systems_shutdown_aura::OnApply(), VehicleAI::OnCharmed(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), FlameLeviathanPursuedTargetSelector::operator()(), OutDebugInfo(), npc_wintergarde_gryphon::PassengerBoarded(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), Map::PlayerRelocation(), SmartScript::ProcessAction(), boss_skadi_grauf::boss_skadi_graufAI::RemoveSkadi(), Spell::SelectImplicitCasterObjectTargets(), SmartAI::SmartAI(), npc_wintergarde_gryphon::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), npc_storm_cloud::npc_storm_cloudAI::SpellHit(), boss_flame_leviathan::boss_flame_leviathanAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::SpreadFire(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_siege_machine::npc_wg_siege_machineAI::UpdateAI(), UpdateHeight(), and UpdateOrientation().

◆ GetVictim()

Unit * Unit::GetVictim ( ) const
inline
789{ return m_attacking; }

References m_attacking.

Referenced by boss_marli::_chargePlayer(), PetAI::_needToStop(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), SmartAI::AssistPlayerInCombatAgainst(), PetAI::AttackedBy(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), boss_malygos::boss_malygosAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), Object::BuildMovementUpdate(), Creature::CallAssistance(), Creature::CallForHelp(), TurretAI::CanAIAttack(), PetAI::CanAttack(), boss_attumen::CanMeleeHit(), boss_midnight::CanMeleeHit(), boss_swamplord_muselek::CanShootVictim(), Spell::CheckCast(), boss_mandokir::boss_mandokirAI::DamageDealt(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), boss_skadi::boss_skadiAI::DoAction(), UnitAI::DoCast(), UnitAI::DoCastVictim(), ConfusedMovementGenerator< T >::DoFinalize(), Creature::DoFleeToGetAssistance(), UnitAI::DoMeleeAttackIfReady(), boss_zuljin::boss_zuljinAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), ScriptedAI::DoStopAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectTaunt(), boss_ouro::Emerge(), boss_halazzi::EnterPhase(), boss_zuljin::boss_zuljinAI::EnterPhase(), AssistDelayEvent::Execute(), RestoreAttack::Execute(), StartMovementEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::ExecuteEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::ExecuteEvent(), emerald_dragonAI::ExecuteEvent(), spell_shazzrah_gate_dummy::FilterTargets(), spell_malchezaar_enfeeble::FilterTargets(), spell_chain_burn::FilterTargets(), spell_morogrim_tidewalker_watery_grave::FilterTargets(), TimedFleeingMovementGenerator::Finalize(), getAttackerForHelper(), ThreatMgr::GetCurrentVictim(), Player::GetInitialVisiblePackets(), CreatureGroup::GetNewTargetForMember(), SmartScript::GetTargets(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), cast_commandscript::HandleCastTargetCommad(), spell_aggro_drones::HandleDummy(), spell_gen_threshalisk_charge::HandleDummy(), HandleDummyAuraProc(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_lurker_below_spout::HandleEffectRemove(), AuraEffect::HandleModPossessPet(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandleSetRaidDifficultyOpcode(), ChaseMovementGenerator< T >::HasLostTarget(), Spell::InitExplicitTargets(), RotateMovementGenerator::Initialize(), IsMutualChase(), boss_ouro::IsPlayerWithinMeleeRange(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), npc_malchezaar_axe::JustEngagedWith(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::JustEngagedWith(), npc_zealot_zath::JustEngagedWith(), npc_yor::JustEngagedWith(), npc_flame_of_azzinoth::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), npc_thaladred::JustEngagedWith(), boss_nethermancer_sepethrea::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), boss_vem::JustEngagedWith(), boss_veklor::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_midnight::JustSummoned(), boss_nightbane::JustSummoned(), boss_halazzi::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), boss_the_black_stalker::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), npc_emily::npc_emilyAI::JustSummoned(), PetAI::KilledUnit(), boss_ick::boss_ickAI::KilledUnit(), boss_flame_leviathan::boss_flame_leviathanAI::KilledUnit(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), CreatureGroup::MemberEngagingTarget(), SmartAI::MoveAway(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), npc_kerlonian::npc_kerlonianAI::MoveInLineOfSight(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_ringo::npc_ringoAI::MoveInLineOfSight(), boss_gluth::boss_gluthAI::MoveInLineOfSight(), npc_future_you::npc_future_youAI::MoveInLineOfSight(), npc_captain_saeed::npc_captain_saeedAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), boss_nightbane::MovementInform(), boss_bug_trio::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_kagani_nightstrike::MovementInform(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), NecroticPlagueTargetCheck::operator()(), NonTankTargetSelector::operator()(), BoneStormMoveTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), UnboundPlagueTargetSelector::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), boss_nefarian::PathEndReached(), SmartScript::ProcessEvent(), SmartScript::ProcessEventsFor(), SmartScript::ProcessTimedAction(), npc_mograine::npc_mograineAI::PullCathedral(), boss_grobbulus::boss_grobbulusAI::PullChamberAdds(), Creature::ReleaseFocus(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_pet_hunter_snake_trap::Reset(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), Resurrect(), boss_magtheridon::ScheduleCombatEvents(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), npc_giant_claw_tentacle::ScheduleTasks(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), PetAI::SelectNextTarget(), UnitAI::SelectTargetList(), SmartAI::SetCombatMove(), SetConfused(), SetFeared(), SetStunned(), boss_murmur::ShouldCastResonance(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), npc_escortAI::Start(), FollowerAI::StartFollow(), StopAttackFaction(), StopAttackingInvalidTarget(), SummonCroneIfReady(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), boss_dorothee::SummonTito(), TauntApply(), TauntFadeOut(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Pet::Update(), Creature::Update(), Player::Update(), CasterAI::UpdateAI(), ArcherAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_general_angerforge::boss_general_angerforgeAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_broodlord::boss_broodlordAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), boss_kagani_nightstrike::UpdateAI(), boss_ellris_duskhallow::UpdateAI(), boss_eramas_brightblaze::UpdateAI(), boss_yazzai::UpdateAI(), boss_warlord_salaris::UpdateAI(), boss_garaxxas::UpdateAI(), boss_zelfan::UpdateAI(), boss_selin_fireheart::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_brutallus::boss_brutallusAI::UpdateAI(), boss_sacrolash::boss_sacrolashAI::UpdateAI(), boss_alythess::boss_alythessAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kalec::boss_kalecAI::UpdateAI(), boss_sathrovarr::boss_sathrovarrAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UpdateAI(), boss_zuljin::boss_zuljinAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_muglash::npc_muglashAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_taldaram::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), boss_anomalus::boss_anomalusAI::UpdateAI(), boss_commander_stoutbeard::boss_commander_stoutbeardAI::UpdateAI(), boss_keristrasza::boss_keristraszaAI::UpdateAI(), npc_crystalline_frayer::npc_crystalline_frayerAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), boss_keleseth::boss_kelesethAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), npc_azure_invader::npc_azure_invaderAI::UpdateAI(), npc_azure_raider::npc_azure_raiderAI::UpdateAI(), npc_azure_captain::npc_azure_captainAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), guard_shattrath_scryer::guard_shattrath_scryerAI::UpdateAI(), guard_shattrath_aldor::guard_shattrath_aldorAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), PossessedAI::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_zuljin_vortex::npc_zuljin_vortexAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), npc_pet_gen_gnomish_flame_turret::UpdateAI(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), Player::UpdateFFAPvPFlag(), Player::UpdateFFAPvPState(), SmartAI::UpdatePath(), boss_netherspite::UpdatePortals(), CreatureAI::UpdateVictim(), CreatureAI::UpdateVictimWithGaze(), and boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UseAbility().

◆ GetVirtualItemId()

uint32 Unit::GetVirtualItemId ( uint32  slot) const
21155{
21156 if (slot >= MAX_EQUIPMENT_ITEMS)
21157 return 0;
21158
21160}
#define MAX_EQUIPMENT_ITEMS
Definition: CreatureData.h:36
@ UNIT_VIRTUAL_ITEM_SLOT_ID
Definition: UpdateFields.h:116

References Object::GetUInt32Value(), MAX_EQUIPMENT_ITEMS, and UNIT_VIRTUAL_ITEM_SLOT_ID.

◆ GetVisibleAura()

AuraApplication * Unit::GetVisibleAura ( uint8  slot)
inline
1506 {
1507 VisibleAuraMap::iterator itr = m_visibleAuras.find(slot);
1508 if (itr != m_visibleAuras.end())
1509 return itr->second;
1510 return nullptr;
1511 }

References m_visibleAuras.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), AuraApplication::BuildUpdatePacket(), and WorldSession::HandleRequestPartyMemberStatsOpcode().

◆ GetVisibleAuras()

◆ GetWeaponDamageRange()

float Unit::GetWeaponDamageRange ( WeaponAttackType  attType,
WeaponDamageRange  type,
uint8  damageIndex = 0 
) const
15439{
15440 if (attType == OFF_ATTACK && !HasOffhandWeaponForAttack())
15441 return 0.0f;
15442
15443 return m_weaponDamage[attType][type][damageIndex];
15444}

References HasOffhandWeaponForAttack(), m_weaponDamage, and OFF_ATTACK.

Referenced by Player::_ApplyWeaponDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and Guardian::UpdateDamagePhysical().

◆ GetWeaponProcChance()

float Unit::GetWeaponProcChance ( ) const
13427{
13428 // normalized proc chance for weapon attack speed
13429 // (odd formula...)
13431 return (GetAttackTime(BASE_ATTACK) * 1.8f / 1000.0f);
13433 return (GetAttackTime(OFF_ATTACK) * 1.6f / 1000.0f);
13434 return 0;
13435}

References BASE_ATTACK, GetAttackTime(), HasOffhandWeaponForAttack(), isAttackReady(), and OFF_ATTACK.

Referenced by Player::CastItemCombatSpell().

◆ GetWeaponSkillValue()

uint32 Unit::GetWeaponSkillValue ( WeaponAttackType  attType,
Unit const *  target = nullptr 
) const
3791{
3792 uint32 value = 0;
3793 if (Player const* player = ToPlayer())
3794 {
3795 Item* item = player->GetWeaponForAttack(attType, true);
3796
3797 // feral or unarmed skill only for base attack
3798 if (attType != BASE_ATTACK && !item)
3799 return 0;
3800
3801 if (IsInFeralForm())
3802 return GetMaxSkillValueForLevel(); // always maximized SKILL_FERAL_COMBAT in fact
3803
3804 // weapon skill or (unarmed for base attack)
3805 uint32 skill = SKILL_UNARMED;
3806 if (item)
3807 skill = item->GetSkill();
3808
3809 // in PvP use full skill instead current skill value
3810 value = (target && target->IsControlledByPlayer())
3811 ? player->GetMaxSkillValue(skill)
3812 : player->GetSkillValue(skill);
3813 // Modify value from ratings
3814 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL));
3815 switch (attType)
3816 {
3817 case BASE_ATTACK:
3818 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_MAINHAND));
3819 break;
3820 case OFF_ATTACK:
3821 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_OFFHAND));
3822 break;
3823 case RANGED_ATTACK:
3824 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_RANGED));
3825 break;
3826 default:
3827 break;
3828 }
3829 }
3830 else
3831 value = GetUnitMeleeSkill(target);
3832 return value;
3833}
@ CR_WEAPON_SKILL_RANGED
Definition: Unit.h:239
@ CR_WEAPON_SKILL
Definition: Unit.h:217
@ CR_WEAPON_SKILL_OFFHAND
Definition: Unit.h:238
@ CR_WEAPON_SKILL_MAINHAND
Definition: Unit.h:237
@ SKILL_UNARMED
Definition: SharedDefines.h:2907
uint32 GetSkill()
Definition: Item.cpp:556
bool IsInFeralForm() const
Definition: Unit.h:1483

References BASE_ATTACK, CR_WEAPON_SKILL, CR_WEAPON_SKILL_MAINHAND, CR_WEAPON_SKILL_OFFHAND, CR_WEAPON_SKILL_RANGED, GetMaxSkillValueForLevel(), Item::GetSkill(), GetUnitMeleeSkill(), IsControlledByPlayer(), IsInFeralForm(), OFF_ATTACK, RANGED_ATTACK, SKILL_UNARMED, and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), and Player::UpdateCritPercentage().

◆ HandleAuraProc()

bool Unit::HandleAuraProc ( Unit victim,
uint32  damage,
Aura triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
bool *  handled 
)
private
8731{
8732 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
8733
8734 switch (dummySpell->SpellFamilyName)
8735 {
8737 switch (dummySpell->Id)
8738 {
8739 // Nevermelting Ice Crystal
8740 case 71564:
8741 RemoveAuraFromStack(71564);
8742 *handled = true;
8743 break;
8744 // Gaseous Bloat
8745 case 70672:
8746 case 72455:
8747 case 72832:
8748 case 72833:
8749 {
8750 if (Unit* caster = triggeredByAura->GetCaster())
8751 if (victim && caster->GetGUID() == victim->GetGUID())
8752 {
8753 *handled = true;
8754 uint32 stack = triggeredByAura->GetStackAmount();
8755 int32 const mod = (GetMap()->GetSpawnMode() & 1) ? 1500 : 1250;
8756 int32 dmg = 0;
8757 for (uint8 i = 1; i <= stack; ++i)
8758 dmg += mod * i;
8759 caster->CastCustomSpell(70701, SPELLVALUE_BASE_POINT0, dmg);
8760 }
8761 break;
8762 }
8763 // Ball of Flames Proc
8764 case 71756:
8765 case 72782:
8766 case 72783:
8767 case 72784:
8768 RemoveAuraFromStack(dummySpell->Id);
8769 *handled = true;
8770 break;
8771 // Discerning Eye of the Beast
8772 case 59915:
8773 {
8774 CastSpell(this, 59914, true); // 59914 already has correct basepoints in DBC, no need for custom bp
8775 *handled = true;
8776 break;
8777 }
8778 // Swift Hand of Justice
8779 case 59906:
8780 {
8781 int32 bp0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_0]. CalcValue());
8782 CastCustomSpell(this, 59913, &bp0, nullptr, nullptr, true);
8783 *handled = true;
8784 break;
8785 }
8786 }
8787
8788 break;
8789 case SPELLFAMILY_MAGE:
8790 {
8791 // Combustion
8792 switch (dummySpell->Id)
8793 {
8794 case 11129:
8795 {
8796 *handled = true;
8797 Unit* caster = triggeredByAura->GetCaster();
8798 if (!caster || !damage)
8799 return false;
8800
8801 // last charge and crit
8802 if (triggeredByAura->GetCharges() <= 1 && (procEx & PROC_EX_CRITICAL_HIT))
8803 return true; // charge counting (will removed)
8804
8805 CastSpell(this, 28682, true);
8806
8807 return procEx & PROC_EX_CRITICAL_HIT;
8808 }
8809 // Empowered Fire
8810 case 31656:
8811 case 31657:
8812 case 31658:
8813 {
8814 *handled = true;
8815
8816 SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(67545);
8817 if (!spInfo)
8818 return false;
8819
8820 int32 bp0 = int32(CalculatePct(GetMaxPower(POWER_MANA), spInfo->Effects[0].CalcValue()));
8821 CastCustomSpell(this, 67545, &bp0, nullptr, nullptr, true, nullptr, triggeredByAura->GetEffect(EFFECT_0), GetGUID());
8822 return true;
8823 }
8824 }
8825 break;
8826 }
8828 {
8829 // Blood of the North
8830 // Reaping
8831 // Death Rune Mastery
8832 // xinef: Icon 22 is used for item bonus, skip
8833 if (dummySpell->SpellIconID == 3041 || (dummySpell->SpellIconID == 22 && dummySpell->Id != 62459) || dummySpell->SpellIconID == 2622)
8834 {
8835 *handled = true;
8836 // Convert recently used Blood Rune to Death Rune
8837 if (Player* player = ToPlayer())
8838 {
8839 if (!player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
8840 return false;
8841
8842 // xinef: not true
8843 //RuneType rune = ToPlayer()->GetLastUsedRune();
8844 // can't proc from death rune use
8845 //if (rune == RUNE_DEATH)
8846 // return false;
8847 AuraEffect* aurEff = triggeredByAura->GetEffect(EFFECT_0);
8848 if (!aurEff)
8849 return false;
8850
8851 // Reset amplitude - set death rune remove timer to 30s
8852 aurEff->ResetPeriodic(true);
8853 uint32 runesLeft;
8854
8855 if (dummySpell->SpellIconID == 2622)
8856 runesLeft = 2;
8857 else
8858 runesLeft = 1;
8859
8860 for (uint8 i = 0; i < MAX_RUNES && runesLeft; ++i)
8861 {
8862 if (dummySpell->SpellIconID == 2622)
8863 {
8864 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8865 player->GetBaseRune(i) == RUNE_BLOOD)
8866 continue;
8867 }
8868 else
8869 {
8870 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8871 player->GetBaseRune(i) != RUNE_BLOOD)
8872 continue;
8873 }
8874 if (player->GetRuneCooldown(i) != player->GetRuneBaseCooldown(i, false))
8875 continue;
8876
8877 --runesLeft;
8878 // Mark aura as used
8879 player->AddRuneByAuraEffect(i, RUNE_DEATH, aurEff);
8880 }
8881 return true;
8882 }
8883 return false;
8884 }
8885 break;
8886 }
8888 {
8889 switch (dummySpell->Id)
8890 {
8891 // Item - Warrior T10 Protection 4P Bonus
8892 case 70844:
8893 {
8894 int32 basepoints0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_1]. CalcValue());
8895 CastCustomSpell(this, 70845, &basepoints0, nullptr, nullptr, true);
8896 break;
8897 }
8898 default:
8899 break;
8900 }
8901 break;
8902 }
8903 case SPELLFAMILY_SHAMAN:
8904 {
8905 // Flurry
8906 if ((dummySpell->SpellFamilyFlags[1] & 0x00000200) != 0)
8907 {
8908 if (cooldown)
8909 {
8910 if (HasSpellCooldown(dummySpell->Id))
8911 {
8912 *handled = true;
8913 break;
8914 }
8915
8916 AddSpellCooldown(dummySpell->Id, 0, cooldown);
8917 }
8918 }
8919 break;
8920 }
8921 }
8922 return false;
8923}
@ RUNE_DEATH
Definition: Player.h:412
@ RUNE_BLOOD
Definition: Player.h:409
@ EFFECT_1
Definition: SharedDefines.h:32
@ EFFECT_0
Definition: SharedDefines.h:31
@ SPELLFAMILY_MAGE
Definition: SharedDefines.h:3531
@ SPELLFAMILY_GENERIC
Definition: SharedDefines.h:3528
@ SPELLFAMILY_WARRIOR
Definition: SharedDefines.h:3532
@ SPELLFAMILY_SHAMAN
Definition: SharedDefines.h:3539
@ SPELLFAMILY_DEATHKNIGHT
Definition: SharedDefines.h:3543
virtual bool HasSpellCooldown(uint32) const
Definition: Unit.h:1741
virtual void AddSpellCooldown(uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition: Unit.h:1743
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4925
uint8 GetSpawnMode() const
Definition: Map.h:420
void ResetPeriodic(bool resetPeriodicTimer=false)
Definition: SpellAuraEffects.h:89
AuraEffect * GetEffect(uint8 effIndex) const
Definition: SpellAuras.h:175

References AddSpellCooldown(), CalculatePct(), CastCustomSpell(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, EFFECT_0, EFFECT_1, SpellInfo::Effects, Aura::GetCaster(), Aura::GetCharges(), Aura::GetEffect(), Object::GetGUID(), WorldObject::GetMap(), GetMaxHealth(), GetMaxPower(), Map::GetSpawnMode(), Aura::GetSpellInfo(), Aura::GetStackAmount(), HasSpellCooldown(), SpellInfo::Id, MAX_RUNES, POWER_MANA, PROC_EX_CRITICAL_HIT, RemoveAuraFromStack(), AuraEffect::ResetPeriodic(), RUNE_BLOOD, RUNE_DEATH, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_GENERIC, SPELLFAMILY_MAGE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromCharge()

bool Unit::HandleAuraRaidProcFromCharge ( AuraEffect triggeredByAura)
private
17639{
17640 // aura can be deleted at casts
17641 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17642
17643 uint32 damageSpellId;
17644 switch (spellProto->Id)
17645 {
17646 case 57949: // shiver
17647 damageSpellId = 57952;
17648 //animationSpellId = 57951; dummy effects for jump spell have unknown use (see also 41637)
17649 break;
17650 case 59978: // shiver
17651 damageSpellId = 59979;
17652 break;
17653 case 43593: // Cold Stare
17654 damageSpellId = 43594;
17655 break;
17656 default:
17657 LOG_ERROR("entities.unit", "Unit::HandleAuraRaidProcFromCharge, received unhandled spell: {}", spellProto->Id);
17658 return false;
17659 }
17660
17661 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17662
17663 // jumps
17664 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17665
17666 // current aura expire
17667 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17668
17669 // next target selection
17670 if (jumps > 0)
17671 {
17672 if (Unit* caster = triggeredByAura->GetCaster())
17673 {
17674 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17675 if (Unit* target = GetNextRandomRaidMemberOrPet(radius))
17676 {
17677 CastSpell(target, spellProto, true, nullptr, triggeredByAura, caster_guid);
17678 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17679 aura->SetCharges(jumps);
17680 }
17681 }
17682 }
17683
17684 CastSpell(this, damageSpellId, true, nullptr, triggeredByAura, caster_guid);
17685
17686 return true;
17687}
Unit * GetNextRandomRaidMemberOrPet(float radius)
Definition: Unit.cpp:11100
void SetCharges(uint8 charges)
Definition: SpellAuras.cpp:952

References CastSpell(), SpellInfo::Effects, AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), GetNextRandomRaidMemberOrPet(), AuraEffect::GetSpellInfo(), SpellInfo::Id, LOG_ERROR, and Aura::SetCharges().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromChargeWithValue()

bool Unit::HandleAuraRaidProcFromChargeWithValue ( AuraEffect triggeredByAura)
private
17550{
17551 // aura can be deleted at casts
17552 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17553 int32 heal = triggeredByAura->GetAmount();
17554 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17555
17556 // Currently only Prayer of Mending
17557 if (!(spellProto->SpellFamilyName == SPELLFAMILY_PRIEST && spellProto->SpellFamilyFlags[1] & 0x20))
17558 {
17559 LOG_DEBUG("spells.aura", "Unit::HandleAuraRaidProcFromChargeWithValue, received not handled spell: {}", spellProto->Id);
17560 return false;
17561 }
17562
17563 // jumps
17564 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17565
17566 // current aura expire
17567 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17568
17569 // next target selection
17570 if (jumps > 0)
17571 {
17572 if (Unit* caster = triggeredByAura->GetCaster())
17573 {
17574 // smart healing
17575 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17576 std::list<Unit*> nearMembers;
17577
17578 Player* player = nullptr;
17579 if (IsPlayer())
17580 player = ToPlayer();
17581 else if (GetOwner())
17582 player = GetOwner()->ToPlayer();
17583
17584 if (player)
17585 {
17586 Group* group = player->GetGroup();
17587 if (!group)
17588 {
17589 if (player != this)
17590 {
17591 if (IsWithinDistInMap(player, radius))
17592 nearMembers.push_back(player);
17593 }
17594 else if (Unit* pet = GetGuardianPet())
17595 {
17596 if (IsWithinDistInMap(pet, radius))
17597 nearMembers.push_back(pet);
17598 }
17599 }
17600 else
17601 {
17602 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
17603 if (Player* Target = itr->GetSource())
17604 {
17605 if (Target != this && !IsWithinDistInMap(Target, radius))
17606 continue;
17607
17608 // IsHostileTo check duel and controlled by enemy
17609 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
17610 nearMembers.push_back(Target);
17611
17612 // Push player's pet to vector
17613 if (Unit* pet = Target->GetGuardianPet())
17614 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
17615 nearMembers.push_back(pet);
17616 }
17617 }
17618
17619 if (!nearMembers.empty())
17620 {
17621 nearMembers.sort(Acore::HealthPctOrderPred());
17622 if (Unit* target = nearMembers.front())
17623 {
17624 CastSpell(target, 41637 /*Dummy visual effect triggered by main spell cast*/, true);
17625 CastCustomSpell(target, spellProto->Id, &heal, nullptr, nullptr, true, nullptr, triggeredByAura, caster_guid);
17626 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17627 aura->SetCharges(jumps);
17628 }
17629 }
17630 }
17631 }
17632 }
17633
17634 // heal
17635 CastCustomSpell(this, 33110, &heal, nullptr, nullptr, true, nullptr, nullptr, caster_guid);
17636 return true;
17637}
@ SPELLFAMILY_PRIEST
Definition: SharedDefines.h:3534
Definition: Unit.h:2014

References CastCustomSpell(), CastSpell(), SpellInfo::Effects, AuraEffect::GetAmount(), AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), GetOwner(), AuraEffect::GetSpellInfo(), SpellInfo::Id, IsHostileTo(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, GroupReference::next(), Aura::SetCharges(), SPELLFAMILY_PRIEST, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleDummyAuraProc()

bool Unit::HandleDummyAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
ProcEventInfo const &  eventInfo 
)
private
Todo:
: It should be moved to database, shouldn't it?
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
Todo:
: need more info (cooldowns/PPM)
6590{
6591 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
6592 uint32 effIndex = triggeredByAura->GetEffIndex();
6593 int32 triggerAmount = triggeredByAura->GetAmount();
6594 Spell const* spellProc = eventInfo.GetProcSpell();
6595
6596 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
6597 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
6598
6599 uint32 triggered_spell_id = 0;
6600 uint32 cooldown_spell_id = 0; // for random trigger, will be one of the triggered spell to avoid repeatable triggers
6601 // otherwise, it's the triggered_spell_id by default
6602 Unit* target = victim;
6603 int32 basepoints0 = 0;
6604 ObjectGuid originalCaster;
6605
6606 switch (dummySpell->SpellFamilyName)
6607 {
6609 {
6610 switch (dummySpell->Id)
6611 {
6612 // Overkill
6613 case 58426:
6614 {
6615 triggered_spell_id = 58427;
6616 break;
6617 }
6618 // Unstable Power
6619 case 24658:
6620 {
6621 if (!procSpell || procSpell->Id == 24659)
6622 return false;
6623 // Need remove one 24659 aura
6624 RemoveAuraFromStack(24659);
6625 return true;
6626 }
6627 // Restless Strength
6628 case 24661:
6629 {
6630 // Need remove one 24662 aura
6631 RemoveAuraFromStack(24662);
6632 return true;
6633 }
6634 // Mark of Malice
6635 case 33493:
6636 {
6637 if (triggeredByAura->GetBase()->GetCharges() > 1)
6638 return true;
6639
6640 target = this;
6641 triggered_spell_id = 33494;
6642 break;
6643 }
6644 // Twisted Reflection (boss spell)
6645 case 21063:
6646 triggered_spell_id = 21064;
6647 break;
6648 // Vampiric Aura (boss spell)
6649 case 38196:
6650 {
6651 basepoints0 = 3 * damage; // 300%
6652 if (basepoints0 < 0)
6653 return false;
6654
6655 triggered_spell_id = 31285;
6656 target = this;
6657 break;
6658 }
6659 // Aura of Madness (Darkmoon Card: Madness trinket)
6660 //=====================================================
6661 // 39511 Sociopath: +35 strength (Paladin, Rogue, Druid, Warrior)
6662 // 40997 Delusional: +70 attack power (Rogue, Hunter, Paladin, Warrior, Druid)
6663 // 40998 Kleptomania: +35 agility (Warrior, Rogue, Paladin, Hunter, Druid)
6664 // 40999 Megalomania: +41 damage/healing (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6665 // 41002 Paranoia: +35 spell/melee/ranged crit strike rating (All classes)
6666 // 41005 Manic: +35 haste (spell, melee and ranged) (All classes)
6667 // 41009 Narcissism: +35 intellect (Druid, Shaman, Priest, Warlock, Mage, Paladin, Hunter)
6668 // 41011 Martyr Complex: +35 stamina (All classes)
6669 // 41406 Dementia: Every 5 seconds either gives you +5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6670 // 41409 Dementia: Every 5 seconds either gives you -5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6671 case 39446:
6672 {
6673 if (!IsPlayer() || !IsAlive())
6674 return false;
6675
6676 // Select class defined buff
6677 switch (getClass())
6678 {
6679 case CLASS_PALADIN: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6680 case CLASS_DRUID: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6681 triggered_spell_id = RAND(39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409);
6682 cooldown_spell_id = 39511;
6683 break;
6684 case CLASS_ROGUE: // 39511, 40997, 40998, 41002, 41005, 41011
6685 case CLASS_WARRIOR: // 39511, 40997, 40998, 41002, 41005, 41011
6686 case CLASS_DEATH_KNIGHT:
6687 triggered_spell_id = RAND(39511, 40997, 40998, 41002, 41005, 41011);
6688 cooldown_spell_id = 39511;
6689 break;
6690 case CLASS_PRIEST: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6691 case CLASS_SHAMAN: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6692 case CLASS_MAGE: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6693 case CLASS_WARLOCK: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6694 triggered_spell_id = RAND(40999, 41002, 41005, 41009, 41011, 41406, 41409);
6695 cooldown_spell_id = 40999;
6696 break;
6697 case CLASS_HUNTER: // 40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409
6698 triggered_spell_id = RAND(40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409);
6699 cooldown_spell_id = 40997;
6700 break;
6701 default:
6702 return false;
6703 }
6704
6705 target = this;
6706 if (roll_chance_i(10))
6707 ToPlayer()->Say("This is Madness!", LANG_UNIVERSAL);
6708 break;
6709 }
6710 // Sunwell Exalted Caster Neck (??? neck)
6711 // cast ??? Light's Wrath if Exalted by Aldor
6712 // cast ??? Arcane Bolt if Exalted by Scryers
6713 case 46569:
6714 return false; // old unused version
6715 // Sunwell Exalted Caster Neck (Shattered Sun Pendant of Acumen neck)
6716 // cast 45479 Light's Wrath if Exalted by Aldor
6717 // cast 45429 Arcane Bolt if Exalted by Scryers
6718 case 45481:
6719 {
6720 Player* player = ToPlayer();
6721 if (!player)
6722 return false;
6723
6724 // Get Aldor reputation rank
6725 if (player->GetReputationRank(932) == REP_EXALTED)
6726 {
6727 target = this;
6728 triggered_spell_id = 45479;
6729 break;
6730 }
6731 // Get Scryers reputation rank
6732 if (player->GetReputationRank(934) == REP_EXALTED)
6733 {
6734 // triggered at positive/self casts also, current attack target used then
6735 if (target && IsFriendlyTo(target))
6736 {
6737 target = GetVictim();
6738 if (!target)
6739 {
6740 target = player->GetSelectedUnit();
6741 if (!target)
6742 return false;
6743 }
6744 if (IsFriendlyTo(target))
6745 return false;
6746 }
6747
6748 triggered_spell_id = 45429;
6749 break;
6750 }
6751 return false;
6752 }
6753 // Sunwell Exalted Melee Neck (Shattered Sun Pendant of Might neck)
6754 // cast 45480 Light's Strength if Exalted by Aldor
6755 // cast 45428 Arcane Strike if Exalted by Scryers
6756 case 45482:
6757 {
6758 if (!IsPlayer())
6759 return false;
6760
6761 // Get Aldor reputation rank
6762 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6763 {
6764 target = this;
6765 triggered_spell_id = 45480;
6766 break;
6767 }
6768 // Get Scryers reputation rank
6769 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6770 {
6771 triggered_spell_id = 45428;
6772 break;
6773 }
6774 return false;
6775 }
6776 // Sunwell Exalted Tank Neck (Shattered Sun Pendant of Resolve neck)
6777 // cast 45431 Arcane Insight if Exalted by Aldor
6778 // cast 45432 Light's Ward if Exalted by Scryers
6779 case 45483:
6780 {
6781 if (!IsPlayer())
6782 return false;
6783
6784 // Get Aldor reputation rank
6785 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6786 {
6787 target = this;
6788 triggered_spell_id = 45432;
6789 break;
6790 }
6791 // Get Scryers reputation rank
6792 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6793 {
6794 target = this;
6795 triggered_spell_id = 45431;
6796 break;
6797 }
6798 return false;
6799 }
6800 // Sunwell Exalted Healer Neck (Shattered Sun Pendant of Restoration neck)
6801 // cast 45478 Light's Salvation if Exalted by Aldor
6802 // cast 45430 Arcane Surge if Exalted by Scryers
6803 case 45484:
6804 {
6805 if (!IsPlayer())
6806 return false;
6807
6808 // Get Aldor reputation rank
6809 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6810 {
6811 target = this;
6812 triggered_spell_id = 45478;
6813 break;
6814 }
6815 // Get Scryers reputation rank
6816 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6817 {
6818 triggered_spell_id = 45430;
6819 break;
6820 }
6821 return false;
6822 }
6823 // Kill command
6824 case 58914:
6825 {
6826 // Remove aura stack from pet
6827 RemoveAuraFromStack(58914);
6828 Unit* owner = GetOwner();
6829 if (!owner)
6830 return true;
6831 // reduce the owner's aura stack
6832 owner->RemoveAuraFromStack(34027);
6833 return true;
6834 }
6835 // Vampiric Touch (generic, used by some boss)
6836 case 52723:
6837 case 60501:
6838 {
6839 triggered_spell_id = 52724;
6840 basepoints0 = damage / 2;
6841 target = this;
6842 break;
6843 }
6844 // Divine purpose
6845 case 31871:
6846 case 31872:
6847 {
6848 // Roll chane
6849 if (!victim || !victim->IsAlive() || !roll_chance_i(triggerAmount))
6850 return false;
6851
6852 // Remove any stun effect on target
6854 return true;
6855 }
6856 // Glyph of Life Tap
6857 case 63320:
6858 {
6859 triggered_spell_id = 63321; // Life Tap
6860 break;
6861 }
6862 case 71519: // Deathbringer's Will Normal
6863 {
6864 if (!IsPlayer() || HasSpellCooldown(71484))
6865 return false;
6866
6867 AddSpellCooldown(71484, 0, cooldown);
6868
6869 std::vector<uint32> RandomSpells;
6870 switch (getClass())
6871 {
6872 case CLASS_WARRIOR:
6873 case CLASS_PALADIN:
6874 case CLASS_DEATH_KNIGHT:
6875 RandomSpells.push_back(71484);
6876 RandomSpells.push_back(71491);
6877 RandomSpells.push_back(71492);
6878 break;
6879 case CLASS_SHAMAN:
6880 case CLASS_ROGUE:
6881 RandomSpells.push_back(71486);
6882 RandomSpells.push_back(71485);
6883 RandomSpells.push_back(71492);
6884 break;
6885 case CLASS_DRUID:
6886 RandomSpells.push_back(71484);
6887 RandomSpells.push_back(71485);
6888 RandomSpells.push_back(71492);
6889 break;
6890 case CLASS_HUNTER:
6891 RandomSpells.push_back(71486);
6892 RandomSpells.push_back(71491);
6893 RandomSpells.push_back(71485);
6894 break;
6895 default:
6896 return false;
6897 }
6898 if (RandomSpells.empty()) // shouldn't happen
6899 return false;
6900
6901 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
6902 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
6903 break;
6904 }
6905 case 71562: // Deathbringer's Will Heroic
6906 {
6907 if (!IsPlayer() || HasSpellCooldown(71561))
6908 return false;
6909
6910 AddSpellCooldown(71561, 0, cooldown);
6911
6912 std::vector<uint32> RandomSpells;
6913 switch (getClass())
6914 {
6915 case CLASS_WARRIOR:
6916 case CLASS_PALADIN:
6917 case CLASS_DEATH_KNIGHT:
6918 RandomSpells.push_back(71561);
6919 RandomSpells.push_back(71559);
6920 RandomSpells.push_back(71560);
6921 break;
6922 case CLASS_SHAMAN:
6923 case CLASS_ROGUE:
6924 RandomSpells.push_back(71558);
6925 RandomSpells.push_back(71556);
6926 RandomSpells.push_back(71560);
6927 break;
6928 case CLASS_DRUID:
6929 RandomSpells.push_back(71561);
6930 RandomSpells.push_back(71556);
6931 RandomSpells.push_back(71560);
6932 break;
6933 case CLASS_HUNTER:
6934 RandomSpells.push_back(71558);
6935 RandomSpells.push_back(71559);
6936 RandomSpells.push_back(71556);
6937 break;
6938 default:
6939 return false;
6940 }
6941 if (RandomSpells.empty()) // shouldn't happen
6942 return false;
6943
6944 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
6945 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
6946 break;
6947 }
6948 // Freya, Petrified Bark
6949 case 62933:
6950 case 62337:
6951 {
6952 if (!victim)
6953 return false;
6954
6955 int32 dmg = damage;
6956 victim->CastCustomSpell(this, 62379, &dmg, 0, 0, true);
6957 return true;
6958 }
6959 // Trial of the Champion, Earth Shield
6960 case 67534:
6961 {
6962 const int32 dmg = (int32)damage;
6963 CastCustomSpell(this, 67535, &dmg, nullptr, nullptr, true, 0, triggeredByAura, triggeredByAura->GetCasterGUID());
6964 return true;
6965 }
6966 // Trial of the Crusader, Faction Champions, Retaliation
6967 case 65932:
6968 {
6969 // check attack comes not from behind
6970 if (!victim || !HasInArc(M_PI, victim))
6971 return false;
6972
6973 triggered_spell_id = 65934;
6974 break;
6975 }
6976 // Pit of Saron, Tyrannus, Overlord's Brand
6977 case 69172: // everything except for DoTs
6978 {
6979 if (!target)
6980 return false;
6981 if (Unit* caster = triggeredByAura->GetCaster())
6982 {
6984 {
6985 int32 dmg = 5.5f * damage;
6986 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
6987 }
6988 else
6989 {
6990 if (caster->GetVictim())
6991 {
6992 int32 dmg = damage;
6993 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
6994 }
6995 }
6996 }
6997 return true;
6998 }
6999 // Pit of Saron, Tyrannus, Overlord's Brand
7000 case 69173: // only DoTs
7001 {
7002 if (!target)
7003 return false;
7004 if (Unit* caster = triggeredByAura->GetCaster())
7005 {
7006 if (procEx & PROC_EX_INTERNAL_HOT)
7007 {
7008 int32 dmg = 5.5f * damage;
7009 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
7010 }
7011 else
7012 {
7013 if (caster->GetVictim())
7014 {
7015 int32 dmg = damage;
7016 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
7017 }
7018 }
7019 }
7020 return true;
7021 }
7022 // Icecrown Citadel, Lady Deathwhisper, Vampiric Might
7023 case 70674:
7024 {
7025 if (Unit* caster = triggeredByAura->GetCaster())
7026 {
7027 int32 dmg = 3 * damage;
7028 caster->CastCustomSpell(caster, 70677, &dmg, 0, 0, true);
7029 }
7030 return true;
7031 }
7032 // Item: Purified Shard of the Gods
7033 case 69755:
7034 {
7035 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69733 : 69729);
7036 break;
7037 }
7038 // Item: Shiny Shard of the Gods
7039 case 69739:
7040 {
7041 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69734 : 69730);
7042 break;
7043 }
7044 // VoA: Meteor Fists koralon
7045 case 66725:
7046 case 68161:
7047 {
7048 triggered_spell_id = 66765; // handled by spell_difficulty
7049 break;
7050 }
7051 }
7052 break;
7053 }
7054 case SPELLFAMILY_MAGE:
7055 {
7056 // Magic Absorption
7057 if (dummySpell->SpellIconID == 459) // only this spell has SpellIconID == 459 and dummy aura
7058 {
7060 return false;
7061
7062 // mana reward
7063 basepoints0 = CalculatePct(int32(GetMaxPower(POWER_MANA)), triggerAmount);
7064 target = this;
7065 triggered_spell_id = 29442;
7066 break;
7067 }
7068 // Hot Streak
7069 if (dummySpell->SpellIconID == 2999)
7070 {
7071 if (effIndex != 0)
7072 return false;
7073 AuraEffect* counter = triggeredByAura->GetBase()->GetEffect(EFFECT_1);
7074 if (!counter)
7075 return true;
7076
7077 // Count spell criticals in a row in second aura
7078 if (procEx & PROC_EX_CRITICAL_HIT)
7079 {
7080 counter->SetAmount(counter->GetAmount() * 2);
7081 if (counter->GetAmount() < 100) // not enough
7082 return true;
7083 // Crititcal counted -> roll chance
7084 if (roll_chance_i(triggerAmount))
7085 CastSpell(this, 48108, true, castItem, triggeredByAura);
7086 }
7087 counter->SetAmount(25);
7088 return true;
7089 }
7090 // Incanter's Regalia set (add trigger chance to Mana Shield)
7091 if (dummySpell->SpellFamilyFlags[0] & 0x8000)
7092 {
7093 if (!IsPlayer())
7094 return false;
7095
7096 target = this;
7097 triggered_spell_id = 37436;
7098 break;
7099 }
7100 switch (dummySpell->Id)
7101 {
7102 // Glyph of Polymorph
7103 case 56375:
7104 {
7105 if (!target)
7106 return false;
7107 target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed.
7110 return true;
7111 }
7112 // Glyph of Icy Veins
7113 case 56374:
7114 {
7117 return true;
7118 }
7119 // Glyph of Ice Block
7120 case 56372:
7121 {
7122 Player* player = ToPlayer();
7123 if (!player)
7124 return false;
7125
7126 SpellCooldowns const cooldowns = player->GetSpellCooldowns();
7127 // remove cooldowns on all ranks of Frost Nova
7128 for (SpellCooldowns::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
7129 {
7130 SpellInfo const* cdSpell = sSpellMgr->GetSpellInfo(itr->first);
7131 // Frost Nova
7132 if (cdSpell && cdSpell->SpellFamilyName == SPELLFAMILY_MAGE
7133 && cdSpell->SpellFamilyFlags[0] & 0x00000040)
7134 player->RemoveSpellCooldown(cdSpell->Id, true);
7135 }
7136 break;
7137 }
7138 }
7139 break;
7140 }
7142 {
7143 switch (dummySpell->Id)
7144 {
7145 // Victorious
7146 case 32216:
7147 {
7148 RemoveAura(dummySpell->Id);
7149 return false;
7150 }
7151 }
7152
7153 // Second Wind
7154 if (dummySpell->SpellIconID == 1697)
7155 {
7156 // only for spells and hit/crit (trigger start always) and not start from self casted spells (5530 Mace Stun Effect for example)
7157 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
7158 return false;
7159 // Need stun or root mechanic
7160 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))))
7161 return false;
7162
7163 switch (dummySpell->Id)
7164 {
7165 case 29838:
7166 triggered_spell_id = 29842;
7167 break;
7168 case 29834:
7169 triggered_spell_id = 29841;
7170 break;
7171 case 42770:
7172 triggered_spell_id = 42771;
7173 break;
7174 default:
7175 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled spell id: {} (SW)", dummySpell->Id);
7176 return false;
7177 }
7178
7179 target = this;
7180 break;
7181 }
7182 break;
7183 }
7185 {
7186 switch (dummySpell->Id)
7187 {
7188 // Nightfall
7189 case 18094:
7190 case 18095:
7191 // Glyph of corruption
7192 case 56218:
7193 {
7194 target = this;
7195 triggered_spell_id = 17941;
7196 break;
7197 }
7198 // Soul Leech
7199 case 30293:
7200 case 30295:
7201 case 30296:
7202 {
7203 // Improved Soul Leech
7204 AuraEffectList const& SoulLeechAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
7205 for (Unit::AuraEffectList::const_iterator i = SoulLeechAuras.begin(); i != SoulLeechAuras.end(); ++i)
7206 {
7207 if ((*i)->GetId() == 54117 || (*i)->GetId() == 54118)
7208 {
7209 if ((*i)->GetEffIndex() != 0)
7210 continue;
7211 basepoints0 = int32((*i)->GetAmount());
7212 target = GetGuardianPet();
7213 if (target)
7214 {
7215 // regen mana for pet
7216 CastCustomSpell(target, 54607, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7217 }
7218 // regen mana for caster
7219 CastCustomSpell(this, 59117, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7220 // Get second aura of spell for replenishment effect on party
7221 if (AuraEffect const* aurEff = (*i)->GetBase()->GetEffect(EFFECT_1))
7222 {
7223 // Replenishment - roll chance
7224 if (roll_chance_i(aurEff->GetAmount()))
7225 {
7226 CastSpell(this, 57669, true, castItem, triggeredByAura);
7227 }
7228 }
7229 break;
7230 }
7231 }
7232 // health
7233 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7234 target = this;
7235 triggered_spell_id = 30294;
7236 break;
7237 }
7238 // Shadowflame (Voidheart Raiment set bonus)
7239 case 37377:
7240 {
7241 triggered_spell_id = 37379;
7242 break;
7243 }
7244 // Pet Healing (Corruptor Raiment or Rift Stalker Armor)
7245 case 37381:
7246 {
7247 target = GetGuardianPet();
7248 if (!target)
7249 return false;
7250
7251 // heal amount
7252 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7253 triggered_spell_id = 37382;
7254 break;
7255 }
7256 // Shadowflame Hellfire (Voidheart Raiment set bonus)
7257 case 39437:
7258 {
7259 triggered_spell_id = 37378;
7260 break;
7261 }
7262 }
7263 break;
7264 }
7265 case SPELLFAMILY_PRIEST:
7266 {
7267 // Body and Soul
7268 if (dummySpell->SpellIconID == 2218)
7269 {
7270 // Proc only from Abolish desease on self cast
7271 if (procSpell->Id != 552 || victim != this || !roll_chance_i(triggerAmount))
7272 return false;
7273 triggered_spell_id = 64136;
7274 target = this;
7275 break;
7276 }
7277 switch (dummySpell->Id)
7278 {
7279 // Vampiric Embrace
7280 case 15286:
7281 {
7282 if (!victim || !victim->IsAlive() || procSpell->SpellFamilyFlags[1] & 0x80000)
7283 return false;
7284
7285 // heal amount
7286 int32 total = CalculatePct(int32(damage), triggerAmount);
7287 int32 team = total / 5;
7288 int32 self = total - team;
7289 CastCustomSpell(this, 15290, &team, &self, nullptr, true, castItem, triggeredByAura);
7290 return true; // no hidden cooldown
7291 }
7292 // Priest Tier 6 Trinket (Ashtongue Talisman of Acumen)
7293 case 40438:
7294 {
7295 // Shadow Word: Pain
7296 if (procSpell->SpellFamilyFlags[0] & 0x8000)
7297 triggered_spell_id = 40441;
7298 // Renew
7299 else if (procSpell->SpellFamilyFlags[0] & 0x40)
7300 triggered_spell_id = 40440;
7301 else
7302 return false;
7303
7304 target = this;
7305 break;
7306 }
7307 // Improved Shadowform
7308 case 47570:
7309 case 47569:
7310 {
7311 if (!roll_chance_i(triggerAmount))
7312 return false;
7313
7315 break;
7316 }
7317 // Glyph of Dispel Magic
7318 case 55677:
7319 {
7320 // Dispel Magic shares spellfamilyflag with abolish disease
7321 if (procSpell->SpellIconID != 74)
7322 return false;
7323 if (!target || !target->IsFriendlyTo(this))
7324 return false;
7325
7326 basepoints0 = int32(target->CountPctFromMaxHealth(triggerAmount));
7327 triggered_spell_id = 56131;
7328 break;
7329 }
7330 // Oracle Healing Bonus ("Garments of the Oracle" set)
7331 case 26169:
7332 {
7333 // heal amount
7334 basepoints0 = int32(CalculatePct(damage, 10));
7335 target = this;
7336 triggered_spell_id = 26170;
7337 break;
7338 }
7339 // Frozen Shadoweave (Shadow's Embrace set) warning! its not only priest set
7340 case 39372:
7341 {
7342 if (!procSpell || (procSpell->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_SHADOW)) == 0)
7343 return false;
7344
7345 // heal amount
7346 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7347 target = this;
7348 triggered_spell_id = 39373;
7349 break;
7350 }
7351 // Greater Heal (Vestments of Faith (Priest Tier 3) - 4 pieces bonus)
7352 case 28809:
7353 {
7354 triggered_spell_id = 28810;
7355 break;
7356 }
7357 // Priest T10 Healer 2P Bonus
7358 case 70770:
7359 // Flash Heal
7360 if (procSpell->SpellFamilyFlags[0] & 0x800)
7361 {
7362 triggered_spell_id = 70772;
7363 SpellInfo const* blessHealing = sSpellMgr->GetSpellInfo(triggered_spell_id);
7364 if (!blessHealing || !victim)
7365 return false;
7366 basepoints0 = int32(CalculatePct(damage, triggerAmount) / (blessHealing->GetMaxDuration() / blessHealing->Effects[0].Amplitude));
7367 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
7368 return true;
7369 }
7370 break;
7371 }
7372 break;
7373 }
7374 case SPELLFAMILY_DRUID:
7375 {
7376 switch (dummySpell->Id)
7377 {
7378 // Glyph of Innervate
7379 case 54832:
7380 {
7381 if (procSpell->SpellIconID != 62)
7382 return false;
7383
7384 int32 mana_perc = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcValue();
7385 basepoints0 = int32(CalculatePct(GetCreatePowers(POWER_MANA), mana_perc) / 10);
7386 triggered_spell_id = 54833;
7387 target = this;
7388 break;
7389 }
7390 // Glyph of Starfire
7391 case 54845:
7392 {
7393 triggered_spell_id = 54846;
7394 break;
7395 }
7396 // Glyph of Shred
7397 case 54815:
7398 {
7399 if (!target)
7400 return false;
7401
7402 // try to find spell Rip on the target
7403 if (AuraEffect const* AurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00800000, 0x0, 0x0, GetGUID()))
7404 {
7405 // Rip's max duration, note: spells which modifies Rip's duration also counted like Glyph of Rip
7406 uint32 CountMin = AurEff->GetBase()->GetMaxDuration();
7407
7408 // just Rip's max duration without other spells
7409 uint32 CountMax = AurEff->GetSpellInfo()->GetMaxDuration();
7410
7411 // add possible auras' and Glyph of Shred's max duration
7412 CountMax += 3 * triggerAmount * IN_MILLISECONDS; // Glyph of Shred -> +6 seconds
7413 CountMax += HasAura(54818) ? 4 * IN_MILLISECONDS : 0; // Glyph of Rip -> +4 seconds
7414 CountMax += HasAura(60141) ? 4 * IN_MILLISECONDS : 0; // Rip Duration/Lacerate Damage -> +4 seconds
7415
7416 // if min < max -> that means caster didn't cast 3 shred yet
7417 // so set Rip's duration and max duration
7418 if (CountMin < CountMax)
7419 {
7420 AurEff->GetBase()->SetDuration(AurEff->GetBase()->GetDuration() + triggerAmount * IN_MILLISECONDS);
7421 AurEff->GetBase()->SetMaxDuration(CountMin + triggerAmount * IN_MILLISECONDS);
7422 return true;
7423 }
7424 }
7425 // if not found Rip
7426 return false;
7427 }
7428 // Glyph of Rake
7429 case 54821:
7430 {
7431 if (procSpell->SpellVisual[0] == 750 && procSpell->Effects[1].ApplyAuraName == 3)
7432 {
7433 if (target && target->IsCreature())
7434 {
7435 triggered_spell_id = 54820;
7436 break;
7437 }
7438 }
7439 return false;
7440 }
7441 // Leader of the Pack
7442 case 24932:
7443 {
7444 if (triggerAmount <= 0)
7445 return false;
7446 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
7447 target = this;
7448 triggered_spell_id = 34299;
7449 if (triggeredByAura->GetCasterGUID() != GetGUID())
7450 break;
7451 int32 basepoints1 = CalculatePct(GetMaxPower(Powers(POWER_MANA)), triggerAmount * 2);
7452 // Improved Leader of the Pack
7453 // Check cooldown of heal spell cooldown
7454 if (IsPlayer() && !ToPlayer()->HasSpellCooldown(34299))
7455 CastCustomSpell(this, 68285, &basepoints1, 0, 0, true, 0, triggeredByAura);
7456 break;
7457 }
7458 // Healing Touch (Dreamwalker Raiment set)
7459 case 28719:
7460 {
7461 // mana back
7462 basepoints0 = int32(CalculatePct(spellProc->GetPowerCost(), 30));
7463 target = this;
7464 triggered_spell_id = 28742;
7465 break;
7466 }
7467 // Glyph of Rejuvenation
7468 case 54754:
7469 {
7470 if (!victim || !victim->HealthBelowPct(uint32(triggerAmount)))
7471 return false;
7472 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7473 triggered_spell_id = 54755;
7474 break;
7475 }
7476 // Healing Touch Refund (Idol of Longevity trinket)
7477 case 28847:
7478 {
7479 target = this;
7480 triggered_spell_id = 28848;
7481 break;
7482 }
7483 // Mana Restore (Malorne Raiment set / Malorne Regalia set)
7484 case 37288:
7485 case 37295:
7486 {
7487 target = this;
7488 triggered_spell_id = 37238;
7489 break;
7490 }
7491 // Druid Tier 6 Trinket
7492 case 40442:
7493 {
7494 float chance;
7495
7496 // Starfire
7497 if (procSpell->SpellFamilyFlags[0] & 0x4)
7498 {
7499 triggered_spell_id = 40445;
7500 chance = 25.0f;
7501 }
7502 // Rejuvenation
7503 else if (procSpell->SpellFamilyFlags[0] & 0x10)
7504 {
7505 triggered_spell_id = 40446;
7506 chance = 25.0f;
7507 }
7508 // Mangle (Bear) and Mangle (Cat)
7509 else if (procSpell->SpellFamilyFlags[1] & 0x00000440)
7510 {
7511 triggered_spell_id = 40452;
7512 chance = 40.0f;
7513 }
7514 else
7515 return false;
7516
7517 if (!roll_chance_f(chance))
7518 return false;
7519
7520 target = this;
7521 break;
7522 }
7523 // Maim Interrupt
7524 case 44835:
7525 {
7526 // Deadly Interrupt Effect
7527 triggered_spell_id = 32747;
7528 break;
7529 }
7530 // Item - Druid T10 Restoration 4P Bonus (Rejuvenation)
7531 case 70664:
7532 {
7533 // xinef: proc only from normal Rejuvenation, and proc rejuvenation
7534 if (!victim || !procSpell || procSpell->SpellIconID != 64)
7535 return false;
7536
7537 Player* caster = ToPlayer();
7538 if (!caster)
7539 return false;
7540 if (!caster->GetGroup() && victim == this)
7541 return false;
7542
7543 CastCustomSpell(70691, SPELLVALUE_BASE_POINT0, damage, victim, true);
7544 return true;
7545 }
7546 }
7547 // Eclipse
7548 if (dummySpell->SpellIconID == 2856 && IsPlayer())
7549 {
7550 if (!procSpell || effIndex != 0)
7551 return false;
7552
7553 bool isWrathSpell = (procSpell->SpellFamilyFlags[0] & 1);
7554
7555 if (!roll_chance_f(dummySpell->ProcChance * (isWrathSpell ? 0.6f : 1.0f)))
7556 return false;
7557
7558 target = this;
7559 if (target->HasAura(isWrathSpell ? 48517 : 48518))
7560 return false;
7561
7562 triggered_spell_id = isWrathSpell ? 48518 : 48517;
7563 break;
7564 }
7565 [[fallthrough]];
7566 }
7567 case SPELLFAMILY_ROGUE:
7568 {
7569 switch (dummySpell->Id)
7570 {
7571 // Glyph of Backstab
7572 case 56800:
7573 {
7574 if (victim)
7575 if (AuraEffect* aurEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x100000, 0, 0, GetGUID()))
7576 if (Aura* aur = aurEff->GetBase())
7577 if (!aur->IsRemoved() && aur->GetDuration() > 0)
7578 if ((aur->GetApplyTime() + aur->GetMaxDuration() / 1000 + 5) > (GameTime::GetGameTime().count() + aur->GetDuration() / 1000))
7579 {
7580 aur->SetDuration(aur->GetDuration() + 2000);
7581 return true;
7582 }
7583 return false;
7584 }
7585 // Deadly Throw Interrupt
7586 case 32748:
7587 {
7588 // Prevent cast Deadly Throw Interrupt on self from last effect (apply dummy) of Deadly Throw
7589 if (this == victim)
7590 return false;
7591
7592 triggered_spell_id = 32747;
7593 break;
7594 }
7595 }
7596 // Master of subtlety
7597 if (dummySpell->SpellIconID == 2114)
7598 {
7599 triggered_spell_id = 31665;
7600 basepoints0 = triggerAmount;
7601 break;
7602 }
7603 // Cut to the Chase
7604 if (dummySpell->SpellIconID == 2909)
7605 {
7606 // "refresh your Slice and Dice duration to its 5 combo point maximum"
7607 // lookup Slice and Dice
7608 if (AuraEffect const* aur = GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000, 0, 0))
7609 {
7610 aur->GetBase()->SetDuration(aur->GetSpellInfo()->GetMaxDuration(), true);
7611 return true;
7612 }
7613 return false;
7614 }
7615 // Deadly Brew
7616 else if (dummySpell->SpellIconID == 2963)
7617 {
7618 triggered_spell_id = 3409;
7619 break;
7620 }
7621 // Quick Recovery
7622 else if (dummySpell->SpellIconID == 2116)
7623 {
7624 if (!procSpell)
7625 return false;
7626
7627 // energy cost save
7628 basepoints0 = CalculatePct(int32(procSpell->ManaCost), triggerAmount);
7629 if (basepoints0 <= 0)
7630 return false;
7631
7632 target = this;
7633 triggered_spell_id = 31663;
7634 break;
7635 }
7636 break;
7637 }
7638 case SPELLFAMILY_HUNTER:
7639 {
7640 switch (dummySpell->SpellIconID)
7641 {
7642 case 2236: // Thrill of the Hunt
7643 {
7644 if (!procSpell)
7645 return false;
7646
7648
7649 // Disable charge drop because of Lock and Load
7650 if (spell)
7651 ToPlayer()->SetSpellModTakingSpell(spell, false);
7652
7653 // Explosive Shot
7654 if (procSpell->SpellFamilyFlags[2] & 0x200)
7655 {
7656 if (!victim)
7657 return false;
7658 if (AuraEffect const* pEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_HUNTER, 0x0, 0x80000000, 0x0, GetGUID()))
7659 basepoints0 = pEff->GetSpellInfo()->CalcPowerCost(this, SpellSchoolMask(pEff->GetSpellInfo()->SchoolMask)) * 4 / 10 / 3;
7660 }
7661 else
7662 basepoints0 = procSpell->CalcPowerCost(this, SpellSchoolMask(procSpell->SchoolMask)) * 4 / 10;
7663
7664 if (spell)
7665 ToPlayer()->SetSpellModTakingSpell(spell, true);
7666
7667 if (basepoints0 <= 0)
7668 return false;
7669
7670 target = this;
7671 triggered_spell_id = 34720;
7672 break;
7673 }
7674 case 3406: // Hunting Party
7675 {
7676 triggered_spell_id = 57669;
7677 target = this;
7678 break;
7679 }
7680 case 3560: // Rapid Recuperation
7681 {
7682 // This effect only from Rapid Killing (mana regen)
7683 if (!(procSpell->SpellFamilyFlags[1] & 0x01000000))
7684 return false;
7685
7686 target = this;
7687
7688 switch (dummySpell->Id)
7689 {
7690 case 53228: // Rank 1
7691 triggered_spell_id = 56654;
7692 break;
7693 case 53232: // Rank 2
7694 triggered_spell_id = 58882;
7695 break;
7696 }
7697 break;
7698 }
7699 }
7700
7701 switch (dummySpell->Id)
7702 {
7703 case 57870: // Glyph of Mend Pet
7704 {
7705 if (!victim)
7706 return false;
7707
7708 victim->CastSpell(victim, 57894, true, nullptr, nullptr, GetGUID());
7709 return true;
7710 }
7711 }
7712 break;
7713 }
7715 {
7716 // Light's Beacon - Beacon of Light
7717 if (dummySpell->Id == 53651)
7718 {
7719 if (!victim)
7720 return false;
7721
7722 // Do not proc from Glyph of Holy Light and Judgement of Light
7723 if (procSpell->Id == 20267 || procSpell->Id == 54968)
7724 {
7725 return false;
7726 }
7727
7728 Unit* beaconTarget = triggeredByAura->GetBase()->GetCaster();
7729 if (!beaconTarget || beaconTarget == this || !beaconTarget->GetAura(53563, victim->GetGUID()))
7730 return false;
7731
7732 basepoints0 = int32(damage);
7733 triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(635)) ? 53652 : 53654;
7734
7735 victim->CastCustomSpell(beaconTarget, triggered_spell_id, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura, victim->GetGUID());
7736 return true;
7737 }
7738 // Judgements of the Wise
7739 if (dummySpell->SpellIconID == 3017)
7740 {
7741 target = this;
7742 triggered_spell_id = 31930;
7743 // replenishment
7744 CastSpell(this, 57669, true, castItem, triggeredByAura);
7745 break;
7746 }
7747 // Righteous Vengeance
7748 if (dummySpell->SpellIconID == 3025)
7749 {
7750 if (!victim)
7751 return false;
7752
7753 // 4 damage tick
7754 basepoints0 = triggerAmount * damage / 400;
7755 triggered_spell_id = 61840;
7756 // Add remaining ticks to damage done
7757 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
7758 return true;
7759 }
7760 // Sheath of Light
7761 if (dummySpell->SpellIconID == 3030)
7762 {
7763 // 4 healing tick
7764 basepoints0 = triggerAmount * damage / 400;
7765 triggered_spell_id = 54203;
7766 break;
7767 }
7768 switch (dummySpell->Id)
7769 {
7770 // Judgement of Light
7771 case 20185:
7772 {
7773 if (!victim || !victim->IsAlive() || victim->HasSpellCooldown(20267))
7774 return false;
7775 // 2% of base mana
7776 basepoints0 = int32(victim->CountPctFromMaxHealth(2));
7777 victim->CastCustomSpell(victim, 20267, &basepoints0, 0, 0, true, 0, triggeredByAura);
7778 victim->AddSpellCooldown(20267, 0, 4 * IN_MILLISECONDS);
7779 return true;
7780 }
7781 // Judgement of Wisdom
7782 case 20186:
7783 {
7784 if (!victim || !victim->IsAlive() || !victim->HasActivePowerType(POWER_MANA) || victim->HasSpellCooldown(20268))
7785 return false;
7786
7787 // 2% of base mana
7788 basepoints0 = int32(CalculatePct(victim->GetCreateMana(), 2));
7789 victim->CastCustomSpell(victim, 20268, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura);
7790 victim->AddSpellCooldown(20268, 0, 4 * IN_MILLISECONDS);
7791 return true;
7792 }
7793 // Holy Power (Redemption Armor set)
7794 case 28789:
7795 {
7796 if (!victim)
7797 return false;
7798
7799 // Set class defined buff
7800 switch (victim->getClass())
7801 {
7802 case CLASS_PALADIN:
7803 case CLASS_PRIEST:
7804 case CLASS_SHAMAN:
7805 case CLASS_DRUID:
7806 triggered_spell_id = 28795; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
7807 break;
7808 case CLASS_MAGE:
7809 case CLASS_WARLOCK:
7810 triggered_spell_id = 28793; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
7811 break;
7812 case CLASS_HUNTER:
7813 case CLASS_ROGUE:
7814 triggered_spell_id = 28791; // Increases the friendly target's attack power by $s1 for $d.
7815 break;
7816 case CLASS_WARRIOR:
7817 triggered_spell_id = 28790; // Increases the friendly target's armor
7818 break;
7819 default:
7820 return false;
7821 }
7822 break;
7823 }
7824 // Seal of Vengeance (damage calc on apply aura)
7825 case 31801:
7826 {
7827 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7828 return false;
7829
7830 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7831 bool stacker = !procSpell || procSpell->Id == 53595;
7832 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7833 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7834
7835 if (!stacker && !damager)
7836 return false;
7837
7838 triggered_spell_id = 31803;
7839
7840 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7841 {
7842 if (aur->GetStackAmount() == 5)
7843 {
7844 if (stacker)
7845 aur->RefreshDuration();
7846 }
7847 }
7848
7849 CastSpell(victim, 42463, true, castItem, triggeredByAura); // Seal of Vengeance
7850
7851 if (!stacker)
7852 return false;
7853 break;
7854 }
7855 // Seal of Corruption
7856 case 53736:
7857 {
7858 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7859 return false;
7860
7861 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7862 bool stacker = !procSpell || procSpell->Id == 53595;
7863 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7864 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7865
7866 if (!stacker && !damager)
7867 return false;
7868
7869 triggered_spell_id = 53742;
7870
7871 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7872 {
7873 if (aur->GetStackAmount() == 5)
7874 {
7875 if (stacker)
7876 aur->RefreshDuration();
7877 }
7878 }
7879
7880 CastSpell(victim, 53739, true, castItem, triggeredByAura); // Seal of Corruption
7881
7882 if (!stacker)
7883 return false;
7884 break;
7885 }
7886 // Spiritual Attunement
7887 case 31785:
7888 case 33776:
7889 {
7890 // if healed by another unit (victim)
7891 if (this == victim)
7892 return false;
7893
7894 // dont allow non-positive dots to proc
7895 if (!procSpell || !procSpell->IsPositive())
7896 return false;
7897
7898 HealInfo const* healInfo = eventInfo.GetHealInfo();
7899 if (!healInfo)
7900 {
7901 return false;
7902 }
7903
7904 uint32 effectiveHeal = healInfo->GetEffectiveHeal();
7905 if (effectiveHeal)
7906 {
7907 // heal amount
7908 basepoints0 = int32(CalculatePct(effectiveHeal, triggerAmount));
7909 target = this;
7910
7911 if (basepoints0)
7912 triggered_spell_id = 31786;
7913 }
7914 break;
7915 }
7916 // Paladin Tier 6 Trinket (Ashtongue Talisman of Zeal)
7917 case 40470:
7918 {
7919 if (!procSpell)
7920 return false;
7921
7922 float chance = 0.0f;
7923
7924 // Flash of light/Holy light
7925 if (procSpell->SpellFamilyFlags[0] & 0xC0000000)
7926 {
7927 triggered_spell_id = 40471;
7928 chance = 15.0f;
7929 }
7930 // Judgement (any)
7931 else if (procSpell->SpellFamilyFlags[0] & 0x800000)
7932 {
7933 triggered_spell_id = 40472;
7934 chance = 50.0f;
7935 }
7936 else
7937 return false;
7938
7939 if (!roll_chance_f(chance))
7940 return false;
7941
7942 break;
7943 }
7944 // Glyph of Holy Light
7945 case 54937:
7946 {
7947 triggered_spell_id = 54968;
7948 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7949 break;
7950 }
7951 // Item - Paladin T8 Holy 2P Bonus
7952 case 64890:
7953 {
7954 triggered_spell_id = 64891;
7955 basepoints0 = triggerAmount * damage / 300;
7956 break;
7957 }
7958 case 71406: // Tiny Abomination in a Jar
7959 case 71545: // Tiny Abomination in a Jar (Heroic)
7960 {
7961 if (!victim || !victim->IsAlive())
7962 return false;
7963
7964 CastSpell(this, 71432, true, nullptr, triggeredByAura);
7965
7966 Aura const* dummy = GetAura(71432);
7967 if (!dummy || dummy->GetStackAmount() < (dummySpell->Id == 71406 ? 8 : 7))
7968 return false;
7969
7970 RemoveAurasDueToSpell(71432);
7971 triggered_spell_id = 71433; // default main hand attack
7972 // roll if offhand
7973 if (Player const* player = ToPlayer())
7974 if (player->GetWeaponForAttack(OFF_ATTACK, true) && urand(0, 1))
7975 triggered_spell_id = 71434;
7976 target = victim;
7977 break;
7978 }
7979 // Item - Icecrown 25 Normal Dagger Proc
7980 case 71880:
7981 {
7982 switch (getPowerType())
7983 {
7984 case POWER_MANA:
7985 triggered_spell_id = 71881;
7986 break;
7987 case POWER_RAGE:
7988 triggered_spell_id = 71883;
7989 break;
7990 case POWER_ENERGY:
7991 triggered_spell_id = 71882;
7992 break;
7993 case POWER_RUNIC_POWER:
7994 triggered_spell_id = 71884;
7995 break;
7996 default:
7997 return false;
7998 }
7999 break;
8000 }
8001 // Item - Icecrown 25 Heroic Dagger Proc
8002 case 71892:
8003 {
8004 switch (getPowerType())
8005 {
8006 case POWER_MANA:
8007 triggered_spell_id = 71888;
8008 break;
8009 case POWER_RAGE:
8010 triggered_spell_id = 71886;
8011 break;
8012 case POWER_ENERGY:
8013 triggered_spell_id = 71887;
8014 break;
8015 case POWER_RUNIC_POWER:
8016 triggered_spell_id = 71885;
8017 break;
8018 default:
8019 return false;
8020 }
8021 break;
8022 }
8023 }
8024 break;
8025 }
8026 case SPELLFAMILY_SHAMAN:
8027 {
8028 switch (dummySpell->Id)
8029 {
8030 // Tidal Force
8031 case 55198:
8032 {
8033 // Remove aura stack from caster
8034 RemoveAuraFromStack(55166);
8035 // drop charges
8036 return false;
8037 }
8038 // Totemic Power (The Earthshatterer set)
8039 case 28823:
8040 {
8041 if (!victim)
8042 return false;
8043
8044 // Set class defined buff
8045 switch (victim->getClass())
8046 {
8047 case CLASS_PALADIN:
8048 case CLASS_PRIEST:
8049 case CLASS_SHAMAN:
8050 case CLASS_DRUID:
8051 triggered_spell_id = 28824; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
8052 break;
8053 case CLASS_MAGE:
8054 case CLASS_WARLOCK:
8055 triggered_spell_id = 28825; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
8056 break;
8057 case CLASS_HUNTER:
8058 case CLASS_ROGUE:
8059 triggered_spell_id = 28826; // Increases the friendly target's attack power by $s1 for $d.
8060 break;
8061 case CLASS_WARRIOR:
8062 triggered_spell_id = 28827; // Increases the friendly target's armor
8063 break;
8064 default:
8065 return false;
8066 }
8067 break;
8068 }
8069 // Lesser Healing Wave (Totem of Flowing Water Relic)
8070 case 28849:
8071 {
8072 target = this;
8073 triggered_spell_id = 28850;
8074 break;
8075 }
8076 // Windfury Weapon (Passive) 1-8 Ranks
8077 case 33757:
8078 {
8079 Player* player = ToPlayer();
8080 if (!player || !castItem || !castItem->IsEquipped() || !victim || !victim->IsAlive())
8081 return false;
8082
8083 if (triggeredByAura->GetBase() && castItem->GetGUID() != triggeredByAura->GetBase()->GetCastItemGUID())
8084 return false;
8085
8086 WeaponAttackType attType = WeaponAttackType(player->GetAttackBySlot(castItem->GetSlot()));
8087 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8088 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8089 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8090 return false;
8091
8092 // Now amount of extra power stored in 1 effect of Enchant spell
8093 // Get it by item enchant id
8094 uint32 spellId;
8096 {
8097 case 283:
8098 spellId = 8232;
8099 break; // 1 Rank
8100 case 284:
8101 spellId = 8235;
8102 break; // 2 Rank
8103 case 525:
8104 spellId = 10486;
8105 break; // 3 Rank
8106 case 1669:
8107 spellId = 16362;
8108 break; // 4 Rank
8109 case 2636:
8110 spellId = 25505;
8111 break; // 5 Rank
8112 case 3785:
8113 spellId = 58801;
8114 break; // 6 Rank
8115 case 3786:
8116 spellId = 58803;
8117 break; // 7 Rank
8118 case 3787:
8119 spellId = 58804;
8120 break; // 8 Rank
8121 default:
8122 {
8123 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled item enchantment (rank?) {} for spell id: {} (Windfury)",
8124 castItem->GetEnchantmentId(EnchantmentSlot(TEMP_ENCHANTMENT_SLOT)), dummySpell->Id);
8125 return false;
8126 }
8127 }
8128
8129 SpellInfo const* windfurySpellInfo = sSpellMgr->GetSpellInfo(spellId);
8130 if (!windfurySpellInfo)
8131 {
8132 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non-existing spell id: {} (Windfury)", spellId);
8133 return false;
8134 }
8135
8136 int32 extra_attack_power = CalculateSpellDamage(victim, windfurySpellInfo, 1);
8137
8138 // Value gained from additional AP
8139 basepoints0 = int32(extra_attack_power / 14.0f * GetAttackTime(attType) / 1000);
8140
8141 if (procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8142 triggered_spell_id = 25504;
8143
8144 if (procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8145 triggered_spell_id = 33750;
8146
8147 // custom cooldown processing case
8148 if (player->HasSpellCooldown(dummySpell->Id))
8149 return false;
8150
8151 // apply cooldown before cast to prevent processing itself
8152 player->AddSpellCooldown(dummySpell->Id, 0, 3 * IN_MILLISECONDS);
8153
8154 // Attack Twice
8155 for (uint32 i = 0; i < 2; ++i)
8156 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8157
8158 return true;
8159 }
8160 // Shaman Tier 6 Trinket
8161 case 40463:
8162 {
8163 if (!procSpell)
8164 return false;
8165
8166 float chance;
8167 if (procSpell->SpellFamilyFlags[0] & 0x1)
8168 {
8169 triggered_spell_id = 40465; // Lightning Bolt
8170 chance = 15.0f;
8171 }
8172 else if (procSpell->SpellFamilyFlags[0] & 0x80)
8173 {
8174 triggered_spell_id = 40465; // Lesser Healing Wave
8175 chance = 10.0f;
8176 }
8177 else if (procSpell->SpellFamilyFlags[1] & 0x00000010)
8178 {
8179 triggered_spell_id = 40466; // Stormstrike
8180 chance = 50.0f;
8181 }
8182 else
8183 return false;
8184
8185 if (!roll_chance_f(chance))
8186 return false;
8187
8188 target = this;
8189 break;
8190 }
8191 // Glyph of Healing Wave
8192 case 55440:
8193 {
8194 // Not proc from self heals
8195 if (this == victim)
8196 return false;
8197 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8198 target = this;
8199 triggered_spell_id = 55533;
8200 break;
8201 }
8202 // Spirit Hunt
8203 case 58877:
8204 {
8205 // Cast on owner
8206 target = GetOwner();
8207 if (!target)
8208 return false;
8209 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8210 triggered_spell_id = 58879;
8211 // Heal wolf
8212 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8213 break;
8214 }
8215 // Shaman T9 Elemental 4P Bonus
8216 case 67228:
8217 {
8218 // Lava Burst
8219 if (procSpell->SpellFamilyFlags[1] & 0x1000)
8220 {
8221 triggered_spell_id = 71824;
8222 SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id);
8223 if (!triggeredSpell)
8224 return false;
8225 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / triggeredSpell->Effects[0].Amplitude);
8226 }
8227 break;
8228 }
8229 // Item - Shaman T10 Elemental 4P Bonus
8230 case 70817:
8231 {
8232 if (!target)
8233 return false;
8234 // try to find spell Flame Shock on the target
8235 if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0x0, 0x0, GetGUID()))
8236 {
8237 Aura* flameShock = aurEff->GetBase();
8238 int32 extraTime = 2 * aurEff->GetAmplitude();
8239 flameShock->SetMaxDuration(flameShock->GetMaxDuration() + extraTime);
8240 flameShock->SetDuration(flameShock->GetDuration() + extraTime);
8241
8242 return true;
8243 }
8244 // if not found Flame Shock
8245 return false;
8246 }
8247 break;
8248 }
8249 // Frozen Power
8250 if (dummySpell->SpellIconID == 3780)
8251 {
8252 if (!target)
8253 return false;
8254 if (GetDistance(target) < 15.0f)
8255 return false;
8256 float chance = (float)triggerAmount;
8257 if (!roll_chance_f(chance))
8258 return false;
8259
8260 triggered_spell_id = 63685;
8261 break;
8262 }
8263 // Ancestral Awakening
8264 if (dummySpell->SpellIconID == 3065)
8265 {
8266 triggered_spell_id = 52759;
8267 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8268 target = this;
8269 break;
8270 }
8271 // Flametongue Weapon (Passive)
8272 if (dummySpell->SpellFamilyFlags[0] & 0x200000)
8273 {
8274 if (!IsPlayer() || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped())
8275 return false;
8276
8278 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8279 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8280 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8281 return false;
8282
8283 float fire_onhit = float(CalculatePct(dummySpell->Effects[EFFECT_0]. CalcValue(), 1.0f));
8284
8285 float add_spellpower = (float)(SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE)
8287
8288 // 1.3speed = 5%, 2.6speed = 10%, 4.0 speed = 15%, so, 1.0speed = 3.84%
8289 ApplyPct(add_spellpower, 3.84f);
8290
8291 // Enchant on Off-Hand and ready?
8292 if (castItem->GetSlot() == EQUIPMENT_SLOT_OFFHAND && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8293 {
8294 float BaseWeaponSpeed = GetAttackTime(OFF_ATTACK) / 1000.0f;
8295
8296 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8297 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8298 triggered_spell_id = 10444;
8299 }
8300
8301 // Enchant on Main-Hand and ready?
8302 else if (castItem->GetSlot() == EQUIPMENT_SLOT_MAINHAND && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8303 {
8304 float BaseWeaponSpeed = GetAttackTime(BASE_ATTACK) / 1000.0f;
8305
8306 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8307 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8308 triggered_spell_id = 10444;
8309 }
8310
8311 // If not ready, we should return, shouldn't we?!
8312 else
8313 return false;
8314
8315 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8316 return true;
8317 }
8318 // Improved Water Shield
8319 if (dummySpell->SpellIconID == 2287)
8320 {
8321 if (!procSpell)
8322 return false;
8323
8324 // Default chance for Healing Wave and Riptide
8325 float chance = (float)triggeredByAura->GetAmount();
8326
8327 if (procSpell->SpellFamilyFlags[0] & 0x80)
8328 // Lesser Healing Wave - 0.6 of default
8329 chance *= 0.6f;
8330 else if (procSpell->SpellFamilyFlags[0] & 0x100)
8331 // Chain heal - 0.3 of default
8332 chance *= 0.3f;
8333
8334 if (!roll_chance_f(chance))
8335 return false;
8336
8337 // Water Shield
8338 if (AuraEffect const* aurEff = GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0, 0x00000020, 0))
8339 {
8340 uint32 spell = aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
8341 CastSpell(this, spell, true, castItem, triggeredByAura);
8342 return true;
8343 }
8344 return false;
8345 }
8346 // Lightning Overload
8347 if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura
8348 {
8349 if (!procSpell || !IsPlayer() || !victim)
8350 return false;
8351
8352 if (procEx & PROC_EX_CRITICAL_HIT)
8353 damage /= 2;
8354
8355 // do not proc off from itself
8356 if (procSpell->Id == 45297 || procSpell->Id == 45284)
8357 {
8358 return false;
8359 }
8360
8361 do
8362 {
8363 uint32 spell = 0;
8364
8365 if (procSpell->SpellFamilyFlags[0] & 0x2)
8366 {
8367 // 1/3 of 33% if 11%
8368 if (!roll_chance_i(33))
8369 return false;
8370
8371 spell = 45297;
8372 }
8373 else
8374 spell = 45284;
8375
8376 // do not reduce damage-spells have correct basepoints
8377 damage /= 2;
8378 int32 dmg = damage;
8379
8380 // Cast
8381 CastCustomSpell(victim, spell, &dmg, 0, 0, true, castItem, triggeredByAura);
8382 } while (roll_chance_i(33));
8383 return true;
8384 }
8385 // Static Shock
8386 if (dummySpell->SpellIconID == 3059)
8387 {
8388 // Lightning Shield
8390 {
8391 uint32 spell = sSpellMgr->GetSpellWithRank(26364, aurEff->GetSpellInfo()->GetRank());
8392 CastSpell(target, spell, true, castItem, triggeredByAura);
8393 aurEff->GetBase()->DropCharge();
8394 return true;
8395 }
8396 return false;
8397 }
8398 break;
8399 }
8401 {
8402 // Improved Blood Presence
8403 if (dummySpell->SpellIconID == 2636)
8404 {
8405 if (!IsPlayer())
8406 return false;
8407 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8408 break;
8409 }
8410 // Butchery
8411 if (dummySpell->SpellIconID == 2664)
8412 {
8413 basepoints0 = triggerAmount;
8414 triggered_spell_id = 50163;
8415 target = this;
8416 break;
8417 }
8418 // Mark of Blood
8419 if (dummySpell->Id == 49005)
8420 {
8422 triggered_spell_id = 61607;
8423 break;
8424 }
8425 // Unholy Blight
8426 if (dummySpell->Id == 49194)
8427 {
8428 triggered_spell_id = 50536;
8429 SpellInfo const* unholyBlight = sSpellMgr->GetSpellInfo(triggered_spell_id);
8430 if (!unholyBlight || !victim)
8431 return false;
8432
8433 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8434
8435 //Glyph of Unholy Blight
8436 if (AuraEffect* glyph = GetAuraEffect(63332, 0))
8437 AddPct(basepoints0, glyph->GetAmount());
8438
8439 basepoints0 = basepoints0 / (unholyBlight->GetMaxDuration() / unholyBlight->Effects[0].Amplitude);
8440 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
8441 return true;
8442 }
8443 // Vendetta
8444 if (dummySpell->SpellFamilyFlags[0] & 0x10000)
8445 {
8446 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
8447 triggered_spell_id = 50181;
8448 target = this;
8449 break;
8450 }
8451 // Necrosis
8452 if (dummySpell->SpellIconID == 2709)
8453 {
8454 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8455 triggered_spell_id = 51460;
8456 break;
8457 }
8458 // Threat of Thassarian
8459 if (dummySpell->SpellIconID == 2023)
8460 {
8461 // Must Dual Wield
8462 if (!procSpell || !HasOffhandWeaponForAttack())
8463 return false;
8464 // Chance as basepoints for dummy aura
8465 if (!roll_chance_i(triggerAmount))
8466 return false;
8467
8468 switch (procSpell->Id)
8469 {
8470 // Obliterate
8471 case 49020:
8472 triggered_spell_id = 66198;
8473 break; // Rank 1
8474 case 51423:
8475 triggered_spell_id = 66972;
8476 break; // Rank 2
8477 case 51424:
8478 triggered_spell_id = 66973;
8479 break; // Rank 3
8480 case 51425:
8481 triggered_spell_id = 66974;
8482 break; // Rank 4
8483
8484 // Frost Strike
8485 case 49143:
8486 triggered_spell_id = 66196;
8487 break; // Rank 1
8488 case 51416:
8489 triggered_spell_id = 66958;
8490 break; // Rank 2
8491 case 51417:
8492 triggered_spell_id = 66959;
8493 break; // Rank 3
8494 case 51418:
8495 triggered_spell_id = 66960;
8496 break; // Rank 4
8497 case 51419:
8498 triggered_spell_id = 66961;
8499 break; // Rank 5
8500 case 55268:
8501 triggered_spell_id = 66962;
8502 break; // Rank 6
8503
8504 // Plague Strike
8505 case 45462:
8506 triggered_spell_id = 66216;
8507 break; // Rank 1
8508 case 49917:
8509 triggered_spell_id = 66988;
8510 break; // Rank 2
8511 case 49918:
8512 triggered_spell_id = 66989;
8513 break; // Rank 3
8514 case 49919:
8515 triggered_spell_id = 66990;
8516 break; // Rank 4
8517 case 49920:
8518 triggered_spell_id = 66991;
8519 break; // Rank 5
8520 case 49921:
8521 triggered_spell_id = 66992;
8522 break; // Rank 6
8523
8524 // Death Strike
8525 case 49998:
8526 triggered_spell_id = 66188;
8527 break; // Rank 1
8528 case 49999:
8529 triggered_spell_id = 66950;
8530 break; // Rank 2
8531 case 45463:
8532 triggered_spell_id = 66951;
8533 break; // Rank 3
8534 case 49923:
8535 triggered_spell_id = 66952;
8536 break; // Rank 4
8537 case 49924:
8538 triggered_spell_id = 66953;
8539 break; // Rank 5
8540
8541 // Rune Strike
8542 case 56815:
8543 triggered_spell_id = 66217;
8544 break; // Rank 1
8545
8546 // Blood Strike
8547 case 45902:
8548 triggered_spell_id = 66215;
8549 break; // Rank 1
8550 case 49926:
8551 triggered_spell_id = 66975;
8552 break; // Rank 2
8553 case 49927:
8554 triggered_spell_id = 66976;
8555 break; // Rank 3
8556 case 49928:
8557 triggered_spell_id = 66977;
8558 break; // Rank 4
8559 case 49929:
8560 triggered_spell_id = 66978;
8561 break; // Rank 5
8562 case 49930:
8563 triggered_spell_id = 66979;
8564 break; // Rank 6
8565 default:
8566 return false;
8567 }
8568
8569 // This should do, restore spell mod so next attack can also use this!
8570 // crit chance for first strike is already computed
8571 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 51124, nullptr); // Killing Machine
8572 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 49796, nullptr); // Deathchill
8573
8574 // Xinef: Somehow basepoints are divided by 2 which is later divided by 2 (offhand multiplier)
8575 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8576 if (triggerEntry->SchoolMask & SPELL_SCHOOL_MASK_NORMAL)
8577 basepoints0 = triggerEntry->Effects[EFFECT_0].BasePoints * 2;
8578
8579 SetCantProc(true);
8580 if (basepoints0)
8581 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8582 else
8583 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8584 SetCantProc(false);
8585 return true;
8586 }
8587 // Runic Power Back on Snare/Root
8588 if (dummySpell->Id == 61257)
8589 {
8590 // only for spells and hit/crit (trigger start always) and not start from self casted spells
8591 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
8592 return false;
8593 // Need snare or root mechanic
8594 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_SNARE))))
8595 return false;
8596 triggered_spell_id = 61258;
8597 target = this;
8598 break;
8599 }
8600 // Sudden Doom
8601 if (dummySpell->SpellIconID == 1939 && IsPlayer())
8602 {
8603 SpellChainNode const* chain = nullptr;
8604 // get highest rank of the Death Coil spell
8605 PlayerSpellMap const& sp_list = ToPlayer()->GetSpellMap();
8606 for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr)
8607 {
8608 // check if shown in spell book
8609 if (!itr->second->Active || !itr->second->IsInSpec(ToPlayer()->GetActiveSpec()) || itr->second->State == PLAYERSPELL_REMOVED)
8610 continue;
8611
8612 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(itr->first);
8613 if (!spellProto)
8614 continue;
8615
8616 if (spellProto->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT
8617 && spellProto->SpellFamilyFlags[0] & 0x2000)
8618 {
8619 SpellChainNode const* newChain = sSpellMgr->GetSpellChainNode(itr->first);
8620
8621 // No chain entry or entry lower than found entry
8622 if (!chain || !newChain || (chain->rank < newChain->rank))
8623 {
8624 triggered_spell_id = itr->first;
8625 chain = newChain;
8626 }
8627 else
8628 continue;
8629 // Found spell is last in chain - do not need to look more
8630 // Optimisation for most common case
8631 if (chain && chain->last->Id == itr->first)
8632 break;
8633 }
8634 }
8635 }
8636 break;
8637 }
8638 case SPELLFAMILY_POTION:
8639 {
8640 // alchemist's stone
8641 if (dummySpell->Id == 17619)
8642 {
8643 if (procSpell->SpellFamilyName == SPELLFAMILY_POTION)
8644 {
8645 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; i++)
8646 {
8647 if (procSpell->Effects[i].Effect == SPELL_EFFECT_HEAL)
8648 {
8649 triggered_spell_id = 21399;
8650 }
8651 else if (procSpell->Effects[i].Effect == SPELL_EFFECT_ENERGIZE)
8652 {
8653 triggered_spell_id = 21400;
8654 }
8655 else
8656 continue;
8657
8658 basepoints0 = int32(CalculateSpellDamage(this, procSpell, i) * 0.4f);
8659 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, nullptr, triggeredByAura);
8660 }
8661 return true;
8662 }
8663 }
8664 break;
8665 }
8666 case SPELLFAMILY_PET:
8667 {
8668 switch (dummySpell->SpellIconID)
8669 {
8670 // Guard Dog
8671 case 201:
8672 {
8673 if (!victim)
8674 return false;
8675
8676 triggered_spell_id = 54445;
8677 target = this;
8678 float addThreat = float(CalculatePct(procSpell->Effects[0].CalcValue(this), triggerAmount));
8679 victim->AddThreat(this, addThreat);
8680 break;
8681 }
8682 // Silverback
8683 case 1582:
8684 triggered_spell_id = dummySpell->Id == 62765 ? 62801 : 62800;
8685 target = this;
8686 break;
8687 }
8688 break;
8689 }
8690 default:
8691 break;
8692 }
8693
8694 // if not handled by custom case, get triggered spell from dummySpell proto
8695 if (!triggered_spell_id)
8696 triggered_spell_id = dummySpell->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
8697
8698 // processed charge only counting case
8699 if (!triggered_spell_id)
8700 return true;
8701
8702 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8703 if (!triggerEntry)
8704 {
8705 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: Spell {} has non-existing triggered spell {}", dummySpell->Id, triggered_spell_id);
8706 return false;
8707 }
8708
8709 if (cooldown_spell_id == 0)
8710 cooldown_spell_id = triggered_spell_id;
8711
8712 if (cooldown)
8713 {
8714 if (HasSpellCooldown(cooldown_spell_id))
8715 return false;
8716
8717 AddSpellCooldown(cooldown_spell_id, 0, cooldown);
8718 }
8719
8720 if (basepoints0)
8721 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8722 else
8723 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8724
8725 return true;
8726}
constexpr auto IN_MILLISECONDS
Definition: Common.h:53
int32 irand(int32 min, int32 max)
Definition: Random.cpp:37
T ApplyPct(T &base, U pct)
Definition: Util.h:73
@ SPELL_AURA_PROC_TRIGGER_SPELL
Definition: SpellAuraDefines.h:105
@ SPELL_AURA_HASTE_SPELLS
Definition: SpellAuraDefines.h:279
@ SPELL_AURA_MOD_MELEE_HASTE
Definition: SpellAuraDefines.h:201
@ SPELL_AURA_MOD_DECREASE_SPEED
Definition: SpellAuraDefines.h:96
@ SPELL_AURA_PERIODIC_DUMMY
Definition: SpellAuraDefines.h:289
@ PROC_EX_INTERNAL_HOT
Definition: SpellMgr.h:220
@ PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS
Definition: SpellMgr.h:128
@ PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS
Definition: SpellMgr.h:122
static First const & RAND(First const &first, Second const &second, Rest const &... rest)
Definition: CreatureAIImpl.h:27
std::map< uint32, SpellCooldown > SpellCooldowns
Definition: Player.h:208
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition: Player.h:193
@ EQUIPMENT_SLOT_MAINHAND
Definition: Player.h:690
@ PLAYERSPELL_REMOVED
Definition: Player.h:122
EnchantmentSlot
Definition: Item.h:168
@ TEMP_ENCHANTMENT_SLOT
Definition: Item.h:170
WeaponAttackType
Definition: Unit.h:208
@ SPELL_EFFECT_ENERGIZE
Definition: SharedDefines.h:808
@ LANG_UNIVERSAL
Definition: SharedDefines.h:735
@ CLASS_DRUID
Definition: SharedDefines.h:151
@ CLASS_SHAMAN
Definition: SharedDefines.h:147
@ CLASS_PRIEST
Definition: SharedDefines.h:145
@ CLASS_WARLOCK
Definition: SharedDefines.h:149
@ CLASS_MAGE
Definition: SharedDefines.h:148
@ CLASS_PALADIN
Definition: SharedDefines.h:142
@ CLASS_ROGUE
Definition: SharedDefines.h:144
@ MECHANIC_STUN
Definition: SharedDefines.h:1337
@ MECHANIC_ROOT
Definition: SharedDefines.h:1332
@ MECHANIC_SNARE
Definition: SharedDefines.h:1336
@ SPELLFAMILY_WARLOCK
Definition: SharedDefines.h:3533
@ SPELLFAMILY_PALADIN
Definition: SharedDefines.h:3538
@ SPELLFAMILY_HUNTER
Definition: SharedDefines.h:3537
@ SPELLFAMILY_POTION
Definition: SharedDefines.h:3541
@ SPELLFAMILY_ROGUE
Definition: SharedDefines.h:3536
@ SPELLFAMILY_DRUID
Definition: SharedDefines.h:3535
@ SPELLFAMILY_PET
Definition: SharedDefines.h:3545
@ REP_EXALTED
Definition: SharedDefines.h:187
@ SPELL_SCHOOL_MASK_SHADOW
Definition: SharedDefines.h:302
@ SPELL_SCHOOL_MASK_FIRE
Definition: SharedDefines.h:299
@ SPELL_SCHOOL_MASK_FROST
Definition: SharedDefines.h:301
uint8 GetSlot() const
Definition: Item.h:281
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition: Item.h:304
bool IsEquipped() const
Definition: Item.cpp:790
void SetSpellModTakingSpell(Spell *spell, bool apply)
Definition: Player.cpp:10077
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition: Player.cpp:9935
bool HasSpellCooldown(uint32 spell_id) const override
Definition: Player.cpp:16337
PlayerSpellMap const & GetSpellMap() const
Definition: Player.h:1758
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition: Player.cpp:11085
SpellCooldowns GetSpellCooldowns() const
Definition: Player.h:2150
static uint8 GetAttackBySlot(uint8 slot)
Definition: PlayerStorage.cpp:544
ReputationRank GetReputationRank(uint32 faction_id) const
Definition: Player.cpp:5862
Unit * GetSelectedUnit() const
Definition: Player.cpp:11538
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition: Player.cpp:3503
void Say(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles said message in regular chat based on declared language and in config pre-defined Range.
Definition: Player.cpp:9338
Item * GetItemByGuid(ObjectGuid guid) const
Definition: PlayerStorage.cpp:409
Spell * m_spellModTakingSpell
Definition: Player.h:2534
Definition: Unit.h:373
uint32 GetEffectiveHeal() const
Definition: Unit.h:413
uint32 GetCreatePowers(Powers power) const
Definition: Unit.cpp:15646
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5581
void RemoveAurasWithMechanic(uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
Definition: Unit.cpp:5253
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition: Unit.cpp:14837
void SetCantProc(bool apply)
Definition: Unit.cpp:17273
bool HealthBelowPct(int32 pct) const
Definition: Unit.h:873
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4909
int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask, bool isDoT=false)
Definition: Unit.cpp:11961
bool IsFriendlyTo(Unit const *unit) const
Definition: Unit.cpp:10232
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:11923
uint32 CountPctFromMaxHealth(int32 pct) const
Definition: Unit.h:878
void CastDelayedSpellWithPeriodicAmount(Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
Definition: Unit.cpp:20293
Powers getPowerType() const
Definition: Unit.h:888
void RemoveMovementImpairingAuras(bool withRoot)
Definition: Unit.cpp:5234
void SetMaxDuration(int32 duration)
Definition: SpellAuras.h:130
SpellInfo const * GetSpellInfo() const
Definition: Spell.h:575
int32 GetPowerCost() const
Definition: Spell.h:576
int32 GetMaxDuration() const
Definition: SpellInfo.cpp:2344
uint32 ProcChance
Definition: SpellInfo.h:356
Definition: SpellMgr.h:554
SpellInfo const * last
Definition: SpellMgr.h:558
uint8 rank
Definition: SpellMgr.h:559

References AddPct(), Player::AddSpellCooldown(), AddSpellCooldown(), AddThreat(), ApplyPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, SpellInfo::CalcPowerCost(), CalculatePct(), CalculateSpellDamage(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CountPctFromMaxHealth(), CURRENT_GENERIC_SPELL, EFFECT_0, EFFECT_1, SpellInfo::Effects, ObjectGuid::Empty, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, SpellInfo::EquippedItemClass, SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), Player::GetAttackBySlot(), GetAttackTime(), GetAura(), GetAuraEffect(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraEffect::GetCaster(), Aura::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetCharges(), getClass(), GetCreateMana(), GetCreatePowers(), WorldObject::GetDistance(), Aura::GetDuration(), Aura::GetEffect(), HealInfo::GetEffectiveHeal(), AuraEffect::GetEffIndex(), Item::GetEnchantmentId(), GameTime::GetGameTime(), Player::GetGroup(), GetGuardianPet(), Object::GetGUID(), ProcEventInfo::GetHealInfo(), Player::GetItemByGuid(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), GetMaxPower(), GetOwner(), Spell::GetPowerCost(), getPowerType(), ProcEventInfo::GetProcSpell(), Player::GetReputationRank(), SpellInfo::GetSchoolMask(), Player::GetSelectedUnit(), Item::GetSlot(), Player::GetSpellCooldowns(), AuraEffect::GetSpellInfo(), Player::GetSpellMap(), Aura::GetStackAmount(), GetVictim(), HasActivePowerType(), HasAura(), Position::HasInArc(), HasOffhandWeaponForAttack(), Player::HasSpellCooldown(), HasSpellCooldown(), HealthBelowPct(), SpellInfo::Id, IN_MILLISECONDS, irand(), IsAlive(), Object::IsCreature(), Item::IsEquipped(), IsFriendlyTo(), Object::IsPlayer(), SpellInfo::IsPositive(), SpellInfo::IsRankOf(), LANG_UNIVERSAL, SpellChainNode::last, LOG_ERROR, m_currentSpells, Player::m_spellModTakingSpell, SpellInfo::ManaCost, MAX_SPELL_EFFECTS, MECHANIC_ROOT, MECHANIC_SNARE, MECHANIC_STUN, OFF_ATTACK, PLAYERSPELL_REMOVED, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, PROC_EX_CRITICAL_HIT, PROC_EX_INTERNAL_HOT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, SpellInfo::ProcChance, RAND(), SpellChainNode::rank, RemoveAura(), RemoveAuraFromStack(), RemoveAurasByType(), RemoveAurasDueToSpell(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), Player::RemoveSpellCooldown(), REP_EXALTED, Player::RestoreSpellMods(), roll_chance_f(), roll_chance_i(), Player::Say(), SpellInfo::SchoolMask, AuraEffect::SetAmount(), SetCantProc(), Aura::SetDuration(), Aura::SetMaxDuration(), Player::SetSpellModTakingSpell(), SPELL_AURA_DUMMY, SPELL_AURA_HASTE_SPELLS, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_DUMMY, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_EFFECT_ENERGIZE, SPELL_EFFECT_HEAL, SPELL_SCHOOL_MASK_FIRE, SPELL_SCHOOL_MASK_FROST, SPELL_SCHOOL_MASK_NORMAL, SPELL_SCHOOL_MASK_SHADOW, SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PET, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, SpellInfo::SpellVisual, sSpellMgr, TEMP_ENCHANTMENT_SLOT, Object::ToPlayer(), and urand().

Referenced by ProcDamageAndSpellFor().

◆ HandleEmoteCommand()

void Unit::HandleEmoteCommand ( uint32  emoteId)
2001{
2003 packet.EmoteID = emoteId;
2004 packet.Guid = GetGUID();
2005 SendMessageToSet(packet.Write(), true);
2006}
Definition: ChatPackets.h:29
WorldPacket const * Write() override
Definition: ChatPackets.cpp:20
uint32 EmoteID
Definition: ChatPackets.h:35
ObjectGuid Guid
Definition: ChatPackets.h:36

References WorldPackets::Chat::Emote::EmoteID, Object::GetGUID(), WorldPackets::Chat::Emote::Guid, WorldObject::SendMessageToSet(), and WorldPackets::Chat::Emote::Write().

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), boss_kiljaeden::boss_kiljaedenAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_viscidus::DamageTaken(), DealMeleeDamage(), boss_twinemperorsAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), StandUpEvent::Execute(), PartyTimeEmoteEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), WorldSession::HandleEmoteOpcode(), npc_commandscript::HandleNpcSayCommand(), npc_commandscript::HandleNpcYellCommand(), WorldSession::HandleTextEmoteOpcode(), npc_maiev_illidan::IsSummonedBy(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_sentinel_leader::MovementInform(), npc_sentinel_infiltrator::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_akama_illidan::MovementInform(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::MovementInform(), boss_felmyst::boss_felmystAI::MovementInform(), npc_kalecgos::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), spell_gen_spectator_cheer_trigger::PrepareSpellScript(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), PetAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), CreatureTextMgr::SendEmote(), boss_grand_warlock_nethekurse::SetData(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_ahune::Submerge(), boss_nightbane::TriggerHealthTakeOff(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::npc_forest_frogAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_shenthul::npc_shenthulAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_highlord_tirion_fordring_lh::npc_highlord_tirion_fordringAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_valiance_keep_cannoneer::npc_valiance_keep_cannoneerAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_dancing_flames::npc_dancing_flamesAI::UpdateAI(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::UpdateAI(), npc_rocknot::npc_rocknotAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_taretha::npc_tarethaAI::WaypointReached(), npc_general_andorov::WaypointReached(), npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached(), npc_engineer_helice::npc_engineer_heliceAI::WaypointReached(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::WaypointReached(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ HandleOverrideClassScriptAuraProc()

bool Unit::HandleOverrideClassScriptAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  cooldown 
)
private
9853{
9854 int32 scriptId = triggeredByAura->GetMiscValue();
9855
9856 if (!victim || !victim->IsAlive())
9857 return false;
9858
9859 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
9860 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
9861
9862 uint32 triggered_spell_id = 0;
9863
9864 switch (scriptId)
9865 {
9866 case 836: // Improved Blizzard (Rank 1)
9867 {
9868 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9869 return false;
9870 triggered_spell_id = 12484;
9871 break;
9872 }
9873 case 988: // Improved Blizzard (Rank 2)
9874 {
9875 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9876 return false;
9877 triggered_spell_id = 12485;
9878 break;
9879 }
9880 case 989: // Improved Blizzard (Rank 3)
9881 {
9882 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9883 return false;
9884 triggered_spell_id = 12486;
9885 break;
9886 }
9887 case 4533: // Dreamwalker Raiment 2 pieces bonus
9888 {
9889 // Chance 50%
9890 if (!roll_chance_i(50))
9891 return false;
9892
9893 switch (victim->getPowerType())
9894 {
9895 case POWER_MANA:
9896 triggered_spell_id = 28722;
9897 break;
9898 case POWER_RAGE:
9899 triggered_spell_id = 28723;
9900 break;
9901 case POWER_ENERGY:
9902 triggered_spell_id = 28724;
9903 break;
9904 default:
9905 return false;
9906 }
9907 break;
9908 }
9909 case 4537: // Dreamwalker Raiment 6 pieces bonus
9910 triggered_spell_id = 28750; // Blessing of the Claw
9911 break;
9912 case 5497: // Improved Mana Gems
9913 triggered_spell_id = 37445; // Mana Surge
9914 break;
9915 case 7010: // Revitalize - can proc on full hp target
9916 case 7011:
9917 case 7012:
9918 {
9919 if (!roll_chance_i(triggeredByAura->GetAmount()))
9920 return false;
9921 switch (victim->getPowerType())
9922 {
9923 case POWER_MANA:
9924 triggered_spell_id = 48542;
9925 break;
9926 case POWER_RAGE:
9927 triggered_spell_id = 48541;
9928 break;
9929 case POWER_ENERGY:
9930 triggered_spell_id = 48540;
9931 break;
9932 case POWER_RUNIC_POWER:
9933 triggered_spell_id = 48543;
9934 break;
9935 default:
9936 break;
9937 }
9938 break;
9939 }
9940 default:
9941 break;
9942 }
9943
9944 // not processed
9945 if (!triggered_spell_id)
9946 return false;
9947
9948 // standard non-dummy case
9949 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
9950
9951 if (!triggerEntry)
9952 {
9953 LOG_ERROR("entities.unit", "Unit::HandleOverrideClassScriptAuraProc: Spell {} triggering for class script id {}", triggered_spell_id, scriptId);
9954 return false;
9955 }
9956
9957 if (cooldown)
9958 {
9959 if (HasSpellCooldown(triggered_spell_id))
9960 return false;
9961
9962 AddSpellCooldown(triggered_spell_id, 0, cooldown);
9963 }
9964
9965 CastSpell(victim, triggered_spell_id, true, castItem, triggeredByAura);
9966
9967 return true;
9968}

References AddSpellCooldown(), CastSpell(), AuraEffect::GetAmount(), AuraEffect::GetBase(), Aura::GetCastItemGUID(), Player::GetItemByGuid(), AuraEffect::GetMiscValue(), getPowerType(), HasSpellCooldown(), IsAlive(), Object::IsPlayer(), LOG_ERROR, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, roll_chance_i(), SpellInfo::SpellVisual, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleProcExtraAttackFor()

void Unit::HandleProcExtraAttackFor ( Unit victim,
uint32  count 
)
2757{
2758 while (count)
2759 {
2760 --count;
2761 AttackerStateUpdate(victim, BASE_ATTACK, true);
2762 }
2763}
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition: Unit.cpp:2565

References AttackerStateUpdate(), and BASE_ATTACK.

Referenced by Update().

◆ HandleProcTriggerSpell()

bool Unit::HandleProcTriggerSpell ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
uint32  procPhase,
ProcEventInfo eventInfo 
)
private
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
8926{
8927 // Get triggered aura spell info
8928 SpellInfo const* auraSpellInfo = triggeredByAura->GetSpellInfo();
8929
8930 // Basepoints of trigger aura
8931 int32 triggerAmount = triggeredByAura->GetAmount();
8932
8933 // Set trigger spell id, target, custom basepoints
8934 uint32 trigger_spell_id = auraSpellInfo->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
8935
8936 Unit* target = nullptr;
8937 int32 basepoints0 = 0;
8938
8939 if (triggeredByAura->GetAuraType() == SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE)
8940 basepoints0 = triggerAmount;
8941
8942 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
8943 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
8944
8945 // Try handle unknown trigger spells
8946 //if (sSpellMgr->GetSpellInfo(trigger_spell_id) == nullptr)
8947 {
8948 switch (auraSpellInfo->SpellFamilyName)
8949 {
8951 switch (auraSpellInfo->Id)
8952 {
8953 case 43820: // Charm of the Witch Doctor (Amani Charm of the Witch Doctor trinket)
8954 // Pct value stored in dummy
8955 if (!victim)
8956 return false;
8957 basepoints0 = victim->GetCreateHealth() * auraSpellInfo->Effects[1].CalcValue() / 100;
8958 target = victim;
8959 break;
8960 case 57345: // Darkmoon Card: Greatness
8961 {
8962 float stat = 0.0f;
8963 // strength
8964 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 60229; stat = GetStat(STAT_STRENGTH); }
8965 // agility
8966 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 60233; stat = GetStat(STAT_AGILITY); }
8967 // intellect
8968 if (GetStat(STAT_INTELLECT) > stat) { trigger_spell_id = 60234; stat = GetStat(STAT_INTELLECT);}
8969 // spirit
8970 if (GetStat(STAT_SPIRIT) > stat) { trigger_spell_id = 60235; }
8971 break;
8972 }
8973 case 67702: // Death's Choice, Item - Coliseum 25 Normal Melee Trinket
8974 {
8975 if (!damage)
8976 return false;
8977 float stat = 0.0f;
8978 // strength
8979 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67708; stat = GetStat(STAT_STRENGTH); }
8980 // agility
8981 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67703; }
8982 break;
8983 }
8984 case 67771: // Death's Choice (heroic), Item - Coliseum 25 Heroic Melee Trinket
8985 {
8986 if (!damage)
8987 return false;
8988 float stat = 0.0f;
8989 // strength
8990 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67773; stat = GetStat(STAT_STRENGTH); }
8991 // agility
8992 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67772; }
8993 break;
8994 }
8995 case 27522: // Mana Drain Trigger
8996 case 40336: // Mana Drain Trigger
8997 case 46939: // Black Bow of the Betrayer
8998 {
8999 // On successful melee or ranged attack gain $29471s1 mana and if possible drain $27526s1 mana from the target.
9000 if (IsAlive())
9001 CastSpell(this, 29471, true, castItem, triggeredByAura);
9002 if (victim && victim->IsAlive())
9003 CastSpell(victim, 27526, true, castItem, triggeredByAura);
9004 return true;
9005 }
9006 // Forge of Souls, Devourer of Souls, Mirrored Soul
9007 case 69023:
9008 {
9009 int32 dmg = damage * 0.45f;
9010 if (dmg > 0)
9011 if (Aura* a = GetAura(69023))
9012 if (Unit* c = a->GetCaster())
9013 CastCustomSpell(c, 69034, &dmg, 0, 0, true);
9014 return true;
9015 }
9016 // Soul-Trader Beacon proc aura
9017 case 50051:
9018 {
9019 if (!victim)
9020 return false;
9021
9023 cr->CastSpell(victim, 50101, true);
9024
9025 return false;
9026 }
9027 }
9028 break;
9029 case SPELLFAMILY_MAGE:
9030 if (auraSpellInfo->SpellIconID == 2127) // Blazing Speed
9031 {
9032 switch (auraSpellInfo->Id)
9033 {
9034 case 31641: // Rank 1
9035 case 31642: // Rank 2
9036 trigger_spell_id = 31643;
9037 break;
9038 default:
9039 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Blazing Speed", auraSpellInfo->Id);
9040 return false;
9041 }
9042 }
9043 else if (auraSpellInfo->Id == 71761) // Deep Freeze Immunity State (only permanent)
9044 {
9045 Creature* creature = victim->ToCreature();
9046 if (!creature || !creature->HasMechanicTemplateImmunity(1 << (MECHANIC_STUN - 1)))
9047 return false;
9048 }
9049 break;
9051 {
9052 // Nether Protection
9053 if (auraSpellInfo->SpellIconID == 1985)
9054 {
9055 if (!procSpell)
9056 return false;
9057 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9058 {
9060 return false; // ignore
9061 case SPELL_SCHOOL_HOLY:
9062 trigger_spell_id = 54370;
9063 break;
9064 case SPELL_SCHOOL_FIRE:
9065 trigger_spell_id = 54371;
9066 break;
9068 trigger_spell_id = 54375;
9069 break;
9070 case SPELL_SCHOOL_FROST:
9071 trigger_spell_id = 54372;
9072 break;
9074 trigger_spell_id = 54374;
9075 break;
9077 trigger_spell_id = 54373;
9078 break;
9079 default:
9080 return false;
9081 }
9082 }
9083 break;
9084 }
9085 case SPELLFAMILY_PRIEST:
9086 {
9087 // Blessed Recovery
9088 if (auraSpellInfo->SpellIconID == 1875)
9089 {
9090 switch (auraSpellInfo->Id)
9091 {
9092 case 27811:
9093 trigger_spell_id = 27813;
9094 break;
9095 case 27815:
9096 trigger_spell_id = 27817;
9097 break;
9098 case 27816:
9099 trigger_spell_id = 27818;
9100 break;
9101 default:
9102 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in BR", auraSpellInfo->Id);
9103 return false;
9104 }
9105 basepoints0 = CalculatePct(int32(damage), triggerAmount) / 3;
9106 target = this;
9107 // Add remaining ticks to healing done
9108 CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
9109 return true;
9110 }
9111 break;
9112 }
9113 case SPELLFAMILY_DRUID:
9114 {
9115 switch (auraSpellInfo->Id)
9116 {
9117 // Druid Forms Trinket
9118 case 37336:
9119 {
9120 switch (GetShapeshiftForm())
9121 {
9122 case FORM_NONE:
9123 trigger_spell_id = 37344;
9124 break;
9125 case FORM_CAT:
9126 trigger_spell_id = 37341;
9127 break;
9128 case FORM_BEAR:
9129 case FORM_DIREBEAR:
9130 trigger_spell_id = 37340;
9131 break;
9132 case FORM_TREE:
9133 trigger_spell_id = 37342;
9134 break;
9135 case FORM_MOONKIN:
9136 trigger_spell_id = 37343;
9137 break;
9138 default:
9139 return false;
9140 }
9141 break;
9142 }
9143 // Druid T9 Feral Relic (Lacerate, Swipe, Mangle, and Shred)
9144 case 67353:
9145 {
9146 switch (GetShapeshiftForm())
9147 {
9148 case FORM_CAT:
9149 trigger_spell_id = 67355;
9150 break;
9151 case FORM_BEAR:
9152 case FORM_DIREBEAR:
9153 trigger_spell_id = 67354;
9154 break;
9155 default:
9156 return false;
9157 }
9158 break;
9159 }
9160 default:
9161 break;
9162 }
9163 break;
9164 }
9165 case SPELLFAMILY_HUNTER:
9166 {
9167 if (auraSpellInfo->SpellIconID == 3247) // Piercing Shots
9168 {
9169 if (!victim)
9170 return false;
9171
9172 switch (auraSpellInfo->Id)
9173 {
9174 case 53234: // Rank 1
9175 case 53237: // Rank 2
9176 case 53238: // Rank 3
9177 trigger_spell_id = 63468;
9178 break;
9179 default:
9180 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Piercing Shots", auraSpellInfo->Id);
9181 return false;
9182 }
9183 SpellInfo const* TriggerPS = sSpellMgr->GetSpellInfo(trigger_spell_id);
9184 if (!TriggerPS)
9185 return false;
9186
9187 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (TriggerPS->GetMaxDuration() / TriggerPS->Effects[0].Amplitude);
9188 victim->CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
9189 return true;
9190 }
9191 // Item - Hunter T9 4P Bonus (Steady Shot)
9192 else if (auraSpellInfo->Id == 67151)
9193 {
9194 if (!IsPlayer() || !ToPlayer()->GetPet())
9195 return false;
9196
9197 target = ToPlayer()->GetPet();
9198 trigger_spell_id = 68130;
9199 break;
9200 }
9201 break;
9202 }
9204 {
9205 switch (auraSpellInfo->Id)
9206 {
9207 // Soul Preserver
9208 case 60510:
9209 {
9210 switch (getClass())
9211 {
9212 case CLASS_DRUID:
9213 trigger_spell_id = 60512;
9214 break;
9215 case CLASS_PALADIN:
9216 trigger_spell_id = 60513;
9217 break;
9218 case CLASS_PRIEST:
9219 trigger_spell_id = 60514;
9220 break;
9221 case CLASS_SHAMAN:
9222 trigger_spell_id = 60515;
9223 break;
9224 }
9225
9226 target = this;
9227 break;
9228 }
9229 case 37657: // Lightning Capacitor
9230 case 54841: // Thunder Capacitor
9231 case 67712: // Item - Coliseum 25 Normal Caster Trinket
9232 case 67758: // Item - Coliseum 25 Heroic Caster Trinket
9233 {
9234 if (!victim || !victim->IsAlive() || !IsPlayer())
9235 return false;
9236
9237 uint32 stack_spell_id = 0;
9238 switch (auraSpellInfo->Id)
9239 {
9240 case 37657:
9241 stack_spell_id = 37658;
9242 trigger_spell_id = 37661;
9243 break;
9244 case 54841:
9245 stack_spell_id = 54842;
9246 trigger_spell_id = 54843;
9247 break;
9248 case 67712:
9249 stack_spell_id = 67713;
9250 trigger_spell_id = 67714;
9251 break;
9252 case 67758:
9253 stack_spell_id = 67759;
9254 trigger_spell_id = 67760;
9255 break;
9256 }
9257
9258 if (cooldown && ToPlayer()->HasSpellCooldown(stack_spell_id))
9259 {
9260 return false;
9261 }
9262
9263 CastSpell(this, stack_spell_id, true, nullptr, triggeredByAura);
9264
9265 Aura* dummy = GetAura(stack_spell_id);
9266 if (!dummy || dummy->GetStackAmount() < triggerAmount)
9267 {
9268 return false;
9269 }
9270
9271 if (cooldown)
9272 {
9273 ToPlayer()->AddSpellCooldown(stack_spell_id, 0, cooldown);
9274 }
9275 RemoveAurasDueToSpell(stack_spell_id);
9276 CastSpell(victim, trigger_spell_id, true, nullptr, triggeredByAura);
9277 return true;
9278 }
9279 default:
9280 // Illumination
9281 if (auraSpellInfo->SpellIconID == 241)
9282 {
9283 if (!procSpell)
9284 return false;
9285 // procspell is triggered spell but we need mana cost of original casted spell
9286 uint32 originalSpellId = procSpell->Id;
9287 // Holy Shock heal
9288 if (procSpell->SpellFamilyFlags[1] & 0x00010000)
9289 {
9290 switch (procSpell->Id)
9291 {
9292 case 25914:
9293 originalSpellId = 20473;
9294 break;
9295 case 25913:
9296 originalSpellId = 20929;
9297 break;
9298 case 25903:
9299 originalSpellId = 20930;
9300 break;
9301 case 27175:
9302 originalSpellId = 27174;
9303 break;
9304 case 33074:
9305 originalSpellId = 33072;
9306 break;
9307 case 48820:
9308 originalSpellId = 48824;
9309 break;
9310 case 48821:
9311 originalSpellId = 48825;
9312 break;
9313 default:
9314 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in HShock", procSpell->Id);
9315 return false;
9316 }
9317 }
9318 SpellInfo const* originalSpell = sSpellMgr->GetSpellInfo(originalSpellId);
9319 if (!originalSpell)
9320 {
9321 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} unknown but selected as original in Illu", originalSpellId);
9322 return false;
9323 }
9324 // percent stored in effect 1 (class scripts) base points
9325 int32 cost = int32(originalSpell->ManaCost + CalculatePct(GetCreateMana(), originalSpell->ManaCostPercentage));
9326 basepoints0 = CalculatePct(cost, auraSpellInfo->Effects[1].CalcValue());
9327 trigger_spell_id = 20272;
9328 target = this;
9329 }
9330 break;
9331 }
9332 break;
9333 }
9334 case SPELLFAMILY_SHAMAN:
9335 {
9336 // Lightning Shield (overwrite non existing triggered spell call in spell.dbc
9337 if (auraSpellInfo->SpellFamilyFlags[0] & 0x400 && auraSpellInfo->HasAttribute(SPELL_ATTR1_NO_THREAT))
9338 {
9339 // Do not proc off from self-casted items
9340 if (Spell const* spell = eventInfo.GetProcSpell())
9341 {
9342 if (spell->m_castItemGUID && victim->GetGUID() == GetGUID())
9343 {
9344 return false;
9345 }
9346 }
9347
9348 trigger_spell_id = sSpellMgr->GetSpellWithRank(26364, auraSpellInfo->GetRank());
9349 }
9350 // Nature's Guardian
9351 else if (auraSpellInfo->SpellIconID == 2013)
9352 {
9353 // Check health condition - should drop to less 30% (damage deal after this!)
9354 if (!HealthBelowPctDamaged(30, damage))
9355 return false;
9356
9357 if (victim && victim->IsAlive())
9358 victim->GetThreatMgr().ModifyThreatByPercent(this, -10);
9359
9360 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
9361 trigger_spell_id = 31616;
9362 target = this;
9363 }
9364 break;
9365 }
9367 {
9368 // Acclimation
9369 if (auraSpellInfo->SpellIconID == 1930)
9370 {
9371 if (!procSpell)
9372 return false;
9373 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9374 {
9376 return false; // ignore
9377 case SPELL_SCHOOL_HOLY:
9378 trigger_spell_id = 50490;
9379 break;
9380 case SPELL_SCHOOL_FIRE:
9381 trigger_spell_id = 50362;
9382 break;
9384 trigger_spell_id = 50488;
9385 break;
9386 case SPELL_SCHOOL_FROST:
9387 trigger_spell_id = 50485;
9388 break;
9390 trigger_spell_id = 50489;
9391 break;
9393 trigger_spell_id = 50486;
9394 break;
9395 default:
9396 return false;
9397 }
9398 }
9399 // Blood Presence (Improved)
9400 else if (auraSpellInfo->Id == 63611)
9401 {
9402 if (!IsPlayer())
9403 return false;
9404
9405 trigger_spell_id = 50475;
9406 basepoints0 = CalculatePct(int32(damage), triggerAmount);
9407 }
9408 break;
9409 }
9410 }
9411 }
9412
9413 // All ok. Check current trigger spell
9414 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(trigger_spell_id);
9415 if (!triggerEntry)
9416 {
9417 // Don't cast unknown spell
9418 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} (effIndex: {}) has unknown TriggerSpell {}. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex(), trigger_spell_id);
9419 return false;
9420 }
9421
9422 // not allow proc extra attack spell at extra attack
9423 if (triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS))
9424 {
9425 uint32 lastExtraAttackSpell = eventInfo.GetActor()->GetLastExtraAttackSpell();
9426
9427 // Patch 1.12.0(?) extra attack abilities can no longer chain proc themselves
9428 if (lastExtraAttackSpell == trigger_spell_id)
9429 {
9430 return false;
9431 }
9432
9433 // Patch 2.2.0 Sword Specialization (Warrior, Rogue) extra attack can no longer proc additional extra attacks
9434 // 3.3.5 Sword Specialization (Warrior), Hack and Slash (Rogue)
9435 if (lastExtraAttackSpell == SPELL_SWORD_SPECIALIZATION || lastExtraAttackSpell == SPELL_HACK_AND_SLASH)
9436 {
9437 return false;
9438 }
9439 }
9440
9441 // Custom requirements (not listed in procEx) Warning! damage dealing after this
9442 // Custom triggered spells
9443 switch (auraSpellInfo->Id)
9444 {
9445 // Deep Wounds
9446 case 12834:
9447 case 12849:
9448 case 12867:
9449 {
9450 if (!IsPlayer())
9451 return false;
9452
9453 if (procFlags & PROC_FLAG_DONE_OFFHAND_ATTACK)
9455 else
9457 break;
9458 }
9459 // Persistent Shield (Scarab Brooch trinket)
9460 // This spell originally trigger 13567 - Dummy Trigger (vs dummy efect)
9461 case 26467:
9462 {
9463 basepoints0 = int32(CalculatePct(damage, 15));
9464 target = victim;
9465 trigger_spell_id = 26470;
9466 break;
9467 }
9468 // Unyielding Knights (item exploit 29108\29109)
9469 case 38164:
9470 {
9471 if (!victim || victim->GetEntry() != 19457) // Proc only if your target is Grillok
9472 return false;
9473 break;
9474 }
9475 // Deflection
9476 case 52420:
9477 {
9478 if (!HealthBelowPct(35))
9479 return false;
9480 break;
9481 }
9482
9483 // Cheat Death
9484 case 28845:
9485 {
9486 // When your health drops below 20%
9487 if (HealthBelowPctDamaged(20, damage) || HealthBelowPct(20))
9488 return false;
9489 break;
9490 }
9491 // Deadly Swiftness (Rank 1)
9492 case 31255:
9493 {
9494 // whenever you deal damage to a target who is below 20% health.
9495 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(20))
9496 return false;
9497
9498 target = this;
9499 trigger_spell_id = 22588;
9500 [[fallthrough]];
9501 }
9502 // Bonus Healing (Crystal Spire of Karabor mace)
9503 case 40971:
9504 {
9505 // If your target is below $s1% health
9506 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(triggerAmount))
9507 return false;
9508 break;
9509 }
9510 // Rapid Recuperation
9511 case 53228:
9512 case 53232:
9513 {
9514 // This effect only from Rapid Fire (ability cast)
9515 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x20))
9516 return false;
9517 break;
9518 }
9519 // Decimation
9520 case 63156:
9521 case 63158:
9522 // Can proc only if target has hp below 35%
9523 if (!victim || !victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, procSpell, this))
9524 return false;
9525 break;
9526 // Ulduar, Hodir, Toasty Fire
9527 case 62821:
9528 if (!this->IsPlayer()) // spell has Attribute, but persistent area auras ignore it
9529 return false;
9530 break;
9531 case 15337: // Improved Spirit Tap (Rank 1)
9532 case 15338: // Improved Spirit Tap (Rank 2)
9533 {
9534 if (!procSpell)
9535 return false;
9536
9537 if (procSpell->SpellFamilyFlags[0] & 0x800000)
9538 if ((procSpell->Id != 58381) || !roll_chance_i(50))
9539 return false;
9540
9541 target = victim;
9542 break;
9543 }
9544 // Professor Putricide - Ooze Spell Tank Protection
9545 case 71770:
9546 if (victim)
9547 victim->CastSpell(victim, trigger_spell_id, true); // EffectImplicitTarget is self
9548 return true;
9549 case 45057: // Evasive Maneuvers (Commendation of Kael`thas trinket)
9550 case 71634: // Item - Icecrown 25 Normal Tank Trinket 1
9551 case 71640: // Item - Icecrown 25 Heroic Tank Trinket 1
9552 case 75475: // Item - Chamber of Aspects 25 Normal Tank Trinket
9553 case 75481: // Item - Chamber of Aspects 25 Heroic Tank Trinket
9554 {
9555 // Procs only if damage takes health below $s1%
9556 if (!HealthBelowPctDamaged(triggerAmount, damage))
9557 return false;
9558 break;
9559 }
9560 default:
9561 break;
9562 }
9563
9564 if (auraSpellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
9565 {
9566 // Xinef: keep this order, Aura 70656 has SpellIconID 85!
9567 // Item - Death Knight T10 Melee 4P Bonus
9568 if (auraSpellInfo->Id == 70656)
9569 {
9571 return false;
9572
9573 for (uint8 i = 0; i < MAX_RUNES; ++i)
9574 if (ToPlayer()->GetRuneCooldown(i) == 0)
9575 return false;
9576 }
9577 // Blade Barrier
9578 else if (auraSpellInfo->SpellIconID == 85)
9579 {
9580 Player* plr = ToPlayer();
9581 if (!plr || !plr->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY) || !procSpell)
9582 return false;
9583
9585 return false;
9586 }
9587 // Rime
9588 else if (auraSpellInfo->SpellIconID == 56)
9589 {
9590 if (!IsPlayer())
9591 return false;
9592
9593 // Howling Blast
9595 }
9596 }
9597
9598 // Custom basepoints/target for exist spell
9599 // dummy basepoints or other customs
9600 switch (trigger_spell_id)
9601 {
9602 // Auras which should proc on area aura source (caster in this case):
9603 // Turn the Tables
9604 case 52914:
9605 case 52915:
9606 case 52910:
9607 // Honor Among Thieves
9608 case 51699:
9609 {
9610 target = triggeredByAura->GetBase()->GetCaster();
9611 if (!target)
9612 return false;
9613
9614 if (Player* pTarget = target->ToPlayer())
9615 {
9616 if (cooldown)
9617 {
9618 if (pTarget->HasSpellCooldown(trigger_spell_id))
9619 return false;
9620 pTarget->AddSpellCooldown(trigger_spell_id, 0, cooldown);
9621 }
9622
9623 Unit* cptarget = nullptr;
9624 if (trigger_spell_id == 51699)
9625 {
9626 cptarget = pTarget->GetComboTarget();
9627 if (!cptarget)
9628 {
9629 cptarget = pTarget->GetSelectedUnit();
9630 }
9631 }
9632 else
9633 cptarget = target;
9634
9635 if (cptarget)
9636 {
9637 target->CastSpell(cptarget, trigger_spell_id, true);
9638 return true;
9639 }
9640 }
9641 return false;
9642 }
9643 // Cast positive spell on enemy target
9644 case 7099: // Curse of Mending
9645 case 39703: // Curse of Mending
9646 case 20233: // Improved Lay on Hands (cast on target)
9647 {
9648 target = victim;
9649 break;
9650 }
9651 // Ruby Drake, Evasive Aura
9652 case 50241:
9653 {
9654 if (GetAura(50240))
9655 return false;
9656
9657 break;
9658 }
9659 // Combo points add triggers (need add combopoint only for main target, and after possible combopoints reset)
9660 case 15250: // Rogue Setup
9661 {
9662 // applied only for main target
9663 if (!victim || (IsPlayer() && victim != ToPlayer()->GetSelectedUnit()))
9664 return false;
9665 break; // continue normal case
9666 }
9667 // Finish movies that add combo
9668 case 14189: // Seal Fate (Netherblade set)
9669 case 14157: // Ruthlessness
9670 {
9671 victim = nullptr;
9672 // Need add combopoint AFTER finish movie (or they dropped in finish phase)
9673 break;
9674 }
9675 // Item - Druid T10 Balance 2P Bonus
9676 case 16870:
9677 {
9678 if (HasAura(70718))
9679 CastSpell(this, 70721, true);
9680 RemoveAurasDueToSpell(trigger_spell_id);
9681 break;
9682 }
9683 // Shamanistic Rage triggered spell
9684 case 30824:
9685 {
9686 basepoints0 = int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), triggerAmount));
9687 break;
9688 }
9689 // Enlightenment (trigger only from mana cost spells)
9690 case 35095:
9691 {
9692 if (!procSpell || procSpell->PowerType != POWER_MANA || (procSpell->ManaCost == 0 && procSpell->ManaCostPercentage == 0 && procSpell->ManaCostPerlevel == 0))
9693 return false;
9694 break;
9695 }
9696 case 46916: // Slam! (Bloodsurge proc)
9697 case 52437: // Sudden Death
9698 {
9699 // Item - Warrior T10 Melee 4P Bonus
9700 if (AuraEffect const* aurEff = GetAuraEffect(70847, 0))
9701 {
9702 if (!roll_chance_i(aurEff->GetAmount()))
9703 {
9704 // Xinef: dont allow normal proc to override set one
9705 if (GetAura((trigger_spell_id == 46916) ? 71072 : 71069))
9706 return false;
9707 // Xinef: just to be sure
9708 RemoveAurasDueToSpell(70849);
9709 break;
9710 }
9711
9712 // Xinef: fully remove all auras and reapply once more
9713 RemoveAurasDueToSpell(70849);
9714 RemoveAurasDueToSpell(71072);
9715 RemoveAurasDueToSpell(71069);
9716
9717 CastSpell(this, 70849, true, castItem, triggeredByAura); // Extra Charge!
9718 if (trigger_spell_id == 46916)
9719 CastSpell(this, 71072, true, castItem, triggeredByAura); // Slam GCD Reduced
9720 else
9721 CastSpell(this, 71069, true, castItem, triggeredByAura); // Execute GCD Reduced
9722 }
9723 break;
9724 }
9725 // Sword and Board
9726 case 50227:
9727 {
9728 // Remove cooldown on Shield Slam
9729 if (IsPlayer())
9731 break;
9732 }
9733 // Maelstrom Weapon
9734 case 53817:
9735 {
9736 // have rank dependent proc chance, ignore too often cases
9737 // PPM = 2.5 * (rank of talent),
9738 uint32 rank = auraSpellInfo->GetRank();
9739 // 5 rank -> 100% 4 rank -> 80% and etc from full rate
9740 if (!roll_chance_i(20 * rank))
9741 return false;
9742
9743 // Item - Shaman T10 Enhancement 4P Bonus
9744 if (AuraEffect const* aurEff = GetAuraEffect(70832, 0))
9745 if (Aura const* maelstrom = GetAura(53817))
9746 // xinef: we have 4 charges and all proc conditions are met - aura reaches 5 charges
9747 if ((maelstrom->GetStackAmount() == 4) && roll_chance_i(aurEff->GetAmount()))
9748 CastSpell(this, 70831, true, castItem, triggeredByAura);
9749
9750 break;
9751 }
9752 // Astral Shift
9753 case 52179:
9754 {
9755 if (!procSpell || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
9756 return false;
9757
9758 // Need stun, fear or silence mechanic
9759 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_SILENCE) | (1 << MECHANIC_STUN) | (1 << MECHANIC_FEAR))))
9760 return false;
9761 break;
9762 }
9763 // Glyph of Death's Embrace
9764 case 58679:
9765 {
9766 // Proc only from healing part of Death Coil. Check is essential as all Death Coil spells have 0x2000 mask in SpellFamilyFlags
9767 if (!procSpell || !(procSpell->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && procSpell->SpellFamilyFlags[0] == 0x80002000))
9768 return false;
9769 break;
9770 }
9771 // Glyph of Death Grip
9772 case 58628:
9773 {
9774 // remove cooldown of Death Grip
9775 if (IsPlayer())
9776 ToPlayer()->RemoveSpellCooldown(49576, true);
9777 return true;
9778 }
9779 // Savage Defense
9780 case 62606:
9781 {
9782 basepoints0 = CalculatePct(triggerAmount, GetTotalAttackPowerValue(BASE_ATTACK));
9783 break;
9784 }
9785 // Body and Soul
9786 case 64128:
9787 case 65081:
9788 {
9789 // Proc only from PW:S cast
9790 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x00000001))
9791 return false;
9792 break;
9793 }
9794 // Culling the Herd
9795 case 70893:
9796 {
9797 if (!procSpell)
9798 {
9799 return false;
9800 }
9801 // check if we're doing a critical hit
9802 if (!(procSpell->SpellFamilyFlags[1] & 0x10000000) && (procEx != PROC_EX_CRITICAL_HIT))
9803 return false;
9804 // check if we're procced by Claw, Bite or Smack (need to use the spell icon ID to detect it)
9805 if (!(procSpell->SpellIconID == 262 || procSpell->SpellIconID == 1680 || procSpell->SpellIconID == 473))
9806 return false;
9807 break;
9808 }
9809 // Fingers of Frost, synchronise with Frostbite
9810 case 44544:
9811 {
9812 if (procPhase == PROC_SPELL_PHASE_HIT)
9813 {
9814 // Find Frostbite
9816 {
9817 if (!victim)
9818 return false;
9819
9820 uint8 fofRank = sSpellMgr->GetSpellRank(triggeredByAura->GetId());
9821 uint8 fbRank = sSpellMgr->GetSpellRank(aurEff->GetId());
9822 uint8 chance = uint8(std::ceil(fofRank * fbRank * 16.6f));
9823
9824 if (roll_chance_i(chance))
9825 CastSpell(victim, aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true);
9826 }
9827 }
9828 break;
9829 }
9830 }
9831
9832 // try detect target manually if not set
9833 if (!target)
9834 target = !(procFlags & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && triggerEntry->IsPositive() ? this : victim;
9835
9836 if (cooldown)
9837 {
9838 if (HasSpellCooldown(triggerEntry->Id))
9839 return false;
9840
9841 AddSpellCooldown(triggerEntry->Id, 0, cooldown);
9842 }
9843
9844 if (basepoints0)
9845 CastCustomSpell(target, triggerEntry->Id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
9846 else
9847 CastSpell(target, triggerEntry->Id, true, castItem, triggeredByAura);
9848
9849 return true;
9850}
@ SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE
Definition: SpellAuraDefines.h:294
@ SPELL_AURA_ADD_TARGET_TRIGGER
Definition: SpellAuraDefines.h:172
@ PROC_SPELL_PHASE_HIT
Definition: SpellMgr.h:244
#define SUMMON_SLOT_MINIPET
Definition: Unit.h:599
@ SPELL_HACK_AND_SLASH
Definition: Unit.h:292
@ SPELL_SWORD_SPECIALIZATION
Definition: Unit.h:291
@ FORM_MOONKIN
Definition: UnitDefines.h:98
@ FORM_NONE
Definition: UnitDefines.h:69
@ FORM_TREE
Definition: UnitDefines.h:71
@ SPELL_EFFECT_ADD_EXTRA_ATTACKS
Definition: SharedDefines.h:797
@ SPELL_ATTR1_NO_THREAT
Definition: SharedDefines.h:429
@ MECHANIC_FEAR
Definition: SharedDefines.h:1330
@ MECHANIC_SILENCE
Definition: SharedDefines.h:1334
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition: SharedDefines.h:1305
Creature * GetCreature(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:210
void ModifyThreatByPercent(Unit *victim, int32 percent)
Definition: ThreatMgr.cpp:508
bool HasMechanicTemplateImmunity(uint32 mask) const
Definition: Creature.cpp:2213
bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const
Definition: Player.cpp:13482
void RemoveCategoryCooldown(uint32 cat)
Definition: Player.cpp:3511
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition: Player.cpp:1280
Spell const * GetProcSpell() const
Definition: Unit.h:448
Unit * GetActor()
Definition: Unit.h:439
bool HealthAbovePct(int32 pct) const
Definition: Unit.h:875
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition: Unit.cpp:15414
uint32 GetLastExtraAttackSpell() const
Definition: Unit.h:1018
uint32 GetCreateHealth() const
Definition: Unit.h:1446
Unit * GetComboTarget() const
Definition: Unit.h:1645
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition: Unit.h:874
uint8 GetRank() const
Definition: SpellInfo.cpp:2493
uint32 ManaCostPercentage
Definition: SpellInfo.h:367
bool HasEffect(SpellEffects effect) const
Definition: SpellInfo.cpp:875
uint32 ManaCost
Definition: SpellInfo.h:363

References Player::AddSpellCooldown(), AddSpellCooldown(), AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, CalculatePct(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_PALADIN, CLASS_PRIEST, CLASS_SHAMAN, CountPctFromMaxHealth(), EFFECT_0, SpellInfo::Effects, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_MOONKIN, FORM_NONE, FORM_TREE, ProcEventInfo::GetActor(), SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), GetAura(), GetAuraEffect(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), Aura::GetCaster(), Aura::GetCastItemGUID(), getClass(), GetComboTarget(), GetCreateHealth(), GetCreateMana(), ObjectAccessor::GetCreature(), AuraEffect::GetEffIndex(), Object::GetEntry(), GetFirstSchoolInMask(), Object::GetFloatValue(), Object::GetGUID(), AuraEffect::GetId(), Player::GetItemByGuid(), GetLastExtraAttackSpell(), SpellInfo::GetMaxDuration(), Player::GetPet(), ProcEventInfo::GetProcSpell(), SpellInfo::GetRank(), SpellInfo::GetSchoolMask(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Aura::GetStackAmount(), GetStat(), GetThreatMgr(), GetTotalAttackPowerValue(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), SpellInfo::HasEffect(), Creature::HasMechanicTemplateImmunity(), HasSpellCooldown(), HealthAbovePct(), HealthBelowPct(), HealthBelowPctDamaged(), SpellInfo::Id, IsAlive(), Player::IsBaseRuneSlotsOnCooldown(), Player::IsClass(), IsClass(), Object::IsPlayer(), SpellInfo::IsPositive(), LOG_ERROR, m_SummonSlot, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, SpellInfo::ManaCostPerlevel, MAX_RUNES, MECHANIC_FEAR, MECHANIC_SILENCE, MECHANIC_STUN, ThreatMgr::ModifyThreatByPercent(), POWER_MANA, SpellInfo::PowerType, PROC_EX_CRITICAL_HIT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, PROC_SPELL_PHASE_HIT, RemoveAurasDueToSpell(), Player::RemoveCategoryCooldown(), Player::RemoveSpellCooldown(), roll_chance_i(), RUNE_BLOOD, SPELL_ATTR1_NO_THREAT, SPELL_AURA_ADD_TARGET_TRIGGER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_EFFECT_ADD_EXTRA_ATTACKS, SPELL_HACK_AND_SLASH, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, SPELL_SWORD_SPECIALIZATION, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sSpellMgr, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STRENGTH, SUMMON_SLOT_MINIPET, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MINDAMAGE, and UNIT_FIELD_MINOFFHANDDAMAGE.

Referenced by ProcDamageAndSpellFor().

◆ HandleSafeUnitPointersOnDelete()

void Unit::HandleSafeUnitPointersOnDelete ( Unit thisUnit)
static
4330{
4331 if (thisUnit->SafeUnitPointerSet.empty())
4332 return;
4333 for (std::set<SafeUnitPointer*>::iterator itr = thisUnit->SafeUnitPointerSet.begin(); itr != thisUnit->SafeUnitPointerSet.end(); ++itr)
4334 (*itr)->UnitDeleted();
4335
4336 thisUnit->SafeUnitPointerSet.clear();
4337}

References SafeUnitPointerSet.

Referenced by ~Unit().

◆ HandleSpellClick()

bool Unit::HandleSpellClick ( Unit clicker,
int8  seatId = -1 
)

First check simple relations from clicker to clickee

Check database conditions

19542{
19543 Creature* creature = ToCreature();
19544 if (creature && creature->IsAIEnabled)
19545 {
19546 if (!creature->AI()->BeforeSpellClick(clicker))
19547 {
19548 return false;
19549 }
19550 }
19551
19552 bool result = false;
19553 uint32 spellClickEntry = GetVehicleKit() ? GetVehicleKit()->GetCreatureEntry() : GetEntry();
19554 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(spellClickEntry);
19555 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
19556 {
19558 if (!itr->second.IsFitToRequirements(clicker, this))
19559 continue;
19560
19562 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(spellClickEntry, itr->second.spellId);
19563 ConditionSourceInfo info = ConditionSourceInfo(clicker, this);
19564 if (!sConditionMgr->IsObjectMeetToConditions(info, conds))
19565 continue;
19566
19567 Unit* caster = (itr->second.castFlags & NPC_CLICK_CAST_CASTER_CLICKER) ? clicker : this;
19568 Unit* target = (itr->second.castFlags & NPC_CLICK_CAST_TARGET_CLICKER) ? clicker : this;
19569 ObjectGuid origCasterGUID = (itr->second.castFlags & NPC_CLICK_CAST_ORIG_CASTER_OWNER) ? GetOwnerGUID() : clicker->GetGUID();
19570
19571 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->second.spellId);
19572
19573 // xinef: dont allow players to enter vehicles on arena
19574 if (spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && caster->IsPlayer() && caster->FindMap() && caster->FindMap()->IsBattleArena())
19575 continue;
19576
19577 if (seatId > -1)
19578 {
19579 uint8 i = 0;
19580 bool valid = false;
19581 while (i < MAX_SPELL_EFFECTS)
19582 {
19583 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_CONTROL_VEHICLE)
19584 {
19585 valid = true;
19586 break;
19587 }
19588 ++i;
19589 }
19590
19591 if (!valid)
19592 {
19593 LOG_ERROR("sql.sql", "Spell {} specified in npc_spellclick_spells is not a valid vehicle enter aura!", itr->second.spellId);
19594 continue;
19595 }
19596
19597 if (IsInMap(caster))
19598 caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0 + i), seatId + 1, target, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19599 else // This can happen during Player::_LoadAuras
19600 {
19602 for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
19603 bp0[j] = spellInfo->Effects[j].BasePoints;
19604
19605 bp0[i] = seatId;
19606 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, bp0, nullptr, origCasterGUID);
19607 }
19608 }
19609 else
19610 {
19611 if (IsInMap(caster))
19612 caster->CastSpell(target, spellInfo, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19613 else
19614 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, nullptr, nullptr, origCasterGUID);
19615 }
19616
19617 result = true;
19618 }
19619
19620 if (creature && creature->IsAIEnabled)
19621 creature->AI()->OnSpellClick(clicker, result);
19622
19623 return result;
19624}
SpellValueMod
Definition: SpellDefines.h:112
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition: ObjectMgr.h:407
#define sConditionMgr
Definition: ConditionMgr.h:289
std::list< Condition * > ConditionList
Definition: ConditionMgr.h:236
@ NPC_CLICK_CAST_TARGET_CLICKER
Definition: SharedDefines.h:691
@ NPC_CLICK_CAST_ORIG_CASTER_OWNER
Definition: SharedDefines.h:692
@ NPC_CLICK_CAST_CASTER_CLICKER
Definition: SharedDefines.h:690
virtual void OnSpellClick(Unit *, bool &)
Definition: CreatureAI.h:201
virtual bool BeforeSpellClick(Unit *)
Definition: CreatureAI.h:199
Definition: ConditionMgr.h:181
Map * FindMap() const
Definition: Object.h:532
uint32 GetCreatureEntry() const
Definition: Vehicle.h:39
bool IsBattleArena() const
Definition: Map.h:455
bool HasAura(AuraType aura) const
Definition: SpellInfo.cpp:892

References Creature::AI(), CreatureAI::BeforeSpellClick(), CastCustomSpell(), CastSpell(), SpellInfo::Effects, WorldObject::FindMap(), Vehicle::GetCreatureEntry(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), GetVehicleKit(), SpellInfo::HasAura(), IsAIEnabled, Map::IsBattleArena(), WorldObject::IsInMap(), Object::IsPlayer(), LOG_ERROR, MAX_EFFECT_MASK, MAX_SPELL_EFFECTS, NPC_CLICK_CAST_CASTER_CLICKER, NPC_CLICK_CAST_ORIG_CASTER_OWNER, NPC_CLICK_CAST_TARGET_CLICKER, CreatureAI::OnSpellClick(), sConditionMgr, sObjectMgr, SPELL_AURA_CONTROL_VEHICLE, SPELLVALUE_BASE_POINT0, sSpellMgr, Object::ToCreature(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, TRIGGERED_NONE, and Aura::TryRefreshStackOrCreate().

Referenced by boss_xt002::boss_xt002AI::AttachHeart(), boss_kologarn::boss_kologarnAI::AttachLeftArm(), boss_kologarn::boss_kologarnAI::AttachRightArm(), WorldSession::HandleSpellClick(), Vehicle::InstallAccessory(), and npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI().

◆ HandleStatModifier()

bool Unit::HandleStatModifier ( UnitMods  unitMod,
UnitModifierType  modifierType,
float  amount,
bool  apply 
)
15190{
15191 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15192 {
15193 LOG_ERROR("entities.unit", "ERROR in HandleStatModifier(): non-existing UnitMods or wrong UnitModifierType!");
15194 return false;
15195 }
15196
15197 switch (modifierType)
15198 {
15199 case BASE_VALUE:
15200 case TOTAL_VALUE:
15201 m_auraModifiersGroup[unitMod][modifierType] += apply ? amount : -amount;
15202 break;
15203 case BASE_PCT:
15204 case TOTAL_PCT:
15205 ApplyPercentModFloatVar(m_auraModifiersGroup[unitMod][modifierType], amount, apply);
15206 break;
15207 default:
15208 break;
15209 }
15210
15211 if (!CanModifyStats())
15212 return false;
15213
15214 switch (unitMod)
15215 {
15222 break;
15223
15224 case UNIT_MOD_ARMOR:
15225 UpdateArmor();
15226 break;
15227 case UNIT_MOD_HEALTH:
15229 break;
15230
15231 case UNIT_MOD_MANA:
15232 case UNIT_MOD_RAGE:
15233 case UNIT_MOD_FOCUS:
15234 case UNIT_MOD_ENERGY:
15235 case UNIT_MOD_HAPPINESS:
15236 case UNIT_MOD_RUNE:
15239 break;
15240
15248 break;
15249
15252 break;
15255 break;
15256
15259 break;
15262 break;
15265 break;
15266
15267 default:
15268 break;
15269 }
15270
15271 return true;
15272}
@ UNIT_MOD_ARMOR
Definition: Unit.h:156
@ UNIT_MOD_ATTACK_POWER
Definition: Unit.h:163
@ UNIT_MOD_HEALTH
Definition: Unit.h:148
@ UNIT_MOD_DAMAGE_RANGED
Definition: Unit.h:167
@ UNIT_MOD_DAMAGE_MAINHAND
Definition: Unit.h:165
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition: Unit.h:164
void apply(T *val)
Definition: ByteConverter.h:40
SpellSchools GetSpellSchoolByAuraGroup(UnitMods unitMod) const
Definition: Unit.cpp:15331
Stats GetStatByAuraGroup(UnitMods unitMod) const
Definition: Unit.cpp:15363
virtual void UpdateAttackPowerAndDamage(bool ranged=false)=0
virtual void UpdateResistances(uint32 school)=0
Powers GetPowerTypeByAuraGroup(UnitMods unitMod) const
Definition: Unit.cpp:15392
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition: StatSystem.cpp:60
virtual void UpdateArmor()=0
virtual void UpdateMaxPower(Powers power)=0
virtual bool UpdateStats(Stats stat)=0
bool CanModifyStats() const
Definition: Unit.h:909
virtual void UpdateMaxHealth()=0

References ApplyPercentModFloatVar(), BASE_ATTACK, BASE_PCT, BASE_VALUE, CanModifyStats(), GetPowerTypeByAuraGroup(), GetSpellSchoolByAuraGroup(), GetStatByAuraGroup(), LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, OFF_ATTACK, RANGED_ATTACK, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_ARMOR, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, UNIT_MOD_END, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_RUNE, UNIT_MOD_RUNIC_POWER, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, UNIT_MOD_STAT_STRENGTH, UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDamagePhysical(), UpdateMaxHealth(), UpdateMaxPower(), UpdateResistances(), and UpdateStats().

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDependentAuraDamageMod(), boss_marli::_schedulePhaseSpider(), boss_marli::_schedulePhaseTroll(), Player::ApplyEnchantment(), AuraEffect::HandleAuraIncreaseBaseHealthPercent(), AuraEffect::HandleAuraModAttackPower(), AuraEffect::HandleAuraModAttackPowerPercent(), AuraEffect::HandleAuraModBaseResistancePCT(), AuraEffect::HandleAuraModIncreaseEnergy(), AuraEffect::HandleAuraModIncreaseEnergyPercent(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), AuraEffect::HandleAuraModRangedAttackPower(), AuraEffect::HandleAuraModRangedAttackPowerPercent(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModResistanceExclusive(), AuraEffect::HandleAuraModStat(), AuraEffect::HandleModBaseResistance(), AuraEffect::HandleModDamageDone(), AuraEffect::HandleModDamagePercentDone(), AuraEffect::HandleModOffhandDamagePercent(), AuraEffect::HandleModPercentStat(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), Guardian::InitStatsForLevel(), spell_astromancer_solarian_transform::OnApply(), spell_astromancer_solarian_transform::OnRemove(), boss_arlokk::boss_arlokkAI::Reset(), boss_marli::Reset(), and boss_arlokk::boss_arlokkAI::UpdateAI().

◆ HasActivePowerType()

◆ HasAura()

bool Unit::HasAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5699{
5700 if (GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask))
5701 return true;
5702 return false;
5703}

References GetAuraApplication().

Referenced by boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), spell_warl_health_funnel::ApplyEffect(), boss_archavon::boss_archavonAI::AttackStart(), boss_emalon::boss_emalonAI::AttackStart(), boss_koralon::boss_koralonAI::AttackStart(), boss_toravon::boss_toravonAI::AttackStart(), boss_hodir::boss_hodirAI::CanAIAttack(), boss_razorgore::boss_razorgoreAI::CanAIAttack(), boss_hazzarah::CanAIAttack(), boss_jindo::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_nethermancer_sepethrea::CanAIAttack(), boss_chromaggus::boss_chromaggusAI::CanAIAttack(), npc_parasitic_shadowfiend::CanAIAttack(), npc_wg_siege_machine::npc_wg_siege_machineAI::CanControlVehicle(), Player::CanJoinToBattleground(), Player::CanResummonPet(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CastItemCombatSpell(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), Spell::CheckCast(), Spell::CheckCasterAuras(), Spell::CheckItems(), spell_pal_hand_of_sacrifice::CheckTarget(), SpellInfo::CheckTarget(), spell_hun_lock_and_load::CheckTrapProc(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_thekal::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), boss_kalecgos::boss_kalecgosAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_midsummer_ribbon_pole_target::DoCleanupChecks(), Spell::DoCreateItem(), Spell::EffectDummy(), Spell::EffectHeal(), Spell::EffectInstaKill(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonPlayer(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), NPCStaveQuestAI::EvadeOnFeignDeath(), IceTombSummonEvent::Execute(), PartyTimeEmoteEvent::Execute(), spell_class_call_polymorph::FilterTargets(), spell_dru_wild_growth::FilterTargets(), spell_pri_circle_of_healing::FilterTargets(), lfg::LFGMgr::FinishDungeon(), GetDispellableAuraList(), instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::GetPlayerInMap(), Player::GetResurrectionSpellId(), Player::GiveXP(), go_wind_stone::go_wind_stoneAI::GossipHello(), go_soulwell::go_soulwellAI::GossipHello(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraMounted(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), spell_thaddius_pos_neg_charge::HandleDamage(), spell_capacitus_polarity_charge::HandleDamage(), spell_mage_summon_water_elemental::HandleDummy(), spell_rog_preparation::HandleDummy(), spell_warr_charge::HandleDummy(), HandleDummyAuraProc(), spell_q12851_going_bearback::HandleEffectApply(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), Player::HandleFall(), gm_commandscript::HandleGMVisibleCommand(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), BattlefieldWG::HandleKill(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleMessagechatOpcode(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_mark_of_frost_freeze::HandleOnHit(), OPvPCapturePointZM_GraveYard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), spell_warr_vigilance::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_pal_lay_on_hands::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_q12611_deathbolt::HandleScriptEffect(), spell_dru_glyph_of_starfire::HandleScriptEffect(), misc_commandscript::HandleUnFreezeCommand(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InformCloud(), boss_taldaram::InitializeAI(), Player::IsDeserter(), SpellArea::IsFitToRequirements(), npc_anzu_spirit::IsSummonedBy(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), IsVampire(), lfg::LFGMgr::JoinLfg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), boss_sindragosa::boss_sindragosaAI::JustDied(), boss_hydross_the_unstable::JustDied(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), boss_bjarngrim::boss_bjarngrimAI::JustEngagedWith(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::JustEngagedWith(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::JustEngagedWith(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), npc_hivezara_stinger::JustEngagedWith(), boss_vem::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), boss_hydross_the_unstable::JustReachedHome(), Kill(), boss_hydross_the_unstable::KilledUnit(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Creature::LoadCreaturesAddon(), MeleeDamageBonusDone(), ModSpellCastTime(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_custodian_of_time::npc_custodian_of_timeAI::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_daranelle::npc_daranelleAI::MoveInLineOfSight(), boss_lady_vashj::MovementInform(), boss_kagani_nightstrike::MovementInform(), achievement_staying_buffed_all_winter_10::OnCheck(), achievement_staying_buffed_all_winter_25::OnCheck(), achievement_flirt_with_disaster_perf_check::OnCheck(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_aged_dying_ancient_kodo::OnGossipHello(), npc_alchemist_adrianna::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_innkeeper::OnGossipHello(), go_manticron_cube::OnGossipHello(), go_orb_of_domination::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::OnPlayerAreaUpdate(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::OnPlayerEnter(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerEnter(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), at_karazhan_atiesh_aran::OnTrigger(), at_hor_battered_hilt_start::OnTrigger(), at_hor_battered_hilt_throw::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), at_commander_dawnforge::OnTrigger(), MidsummerPlayerScript::OnUpdateZone(), Acore::FriendlyMissingBuffInRange::operator()(), NotInStomachSelector::operator()(), SindragosaIceTombCheck::operator()(), NecroticPlagueTargetCheck::operator()(), DefaultTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), DefileTargetSelector::operator()(), WebTargetSelector::operator()(), ShadowOfDeathSelector::operator()(), Acore::UnitAuraCheck::operator()(), SpectralBlastCheck::operator()(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Player::ReportedAfkBy(), npc_corrupted_totem::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), boss_magus_telestra::boss_magus_telestraAI::Reset(), boss_illidan_stormrage::Reset(), boss_fathomlord_karathress::Reset(), npc_pet_pri_shadowfiend::Reset(), Player::RewardHonor(), RewardRage(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_jormungarAI::ScheduleEvents(), boss_supremus::SchedulePhase(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), boss_anomalus::boss_anomalusAI::SetData(), npc_thassarian2::npc_thassarian2AI::sGossipHello(), npc_chesspiece::sGossipHello(), npc_omen::npc_omenAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::SpellHit(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::SpellHit(), SpellPctDamageModsDone(), SpellTakenCritChance(), Player::StoreItem(), boss_moam::SummonedCreatureDies(), boss_apothecary_hummel::boss_apothecary_hummelAI::SummonedCreatureDies(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), npc_cyclone::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_moam::UpdateAI(), boss_ossirian::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), Player::UpdateAreaDependentAuras(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), boss_netherspite::UpdatePortals(), Player::UpdateZoneDependentAuras(), and Spell::WriteAmmoToPacket().

◆ HasAuraEffect()

bool Unit::HasAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  caster = ObjectGuid::Empty 
) const
5669{
5670 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5671 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5672 {
5673 if (itr->second->HasEffect(effIndex)
5674 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5675 {
5676 return true;
5677 }
5678 }
5679 return false;
5680}

References m_appliedAuras.

Referenced by Spell::CanAutoCast(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), spell_q12683_take_sputum_sample::HandleDummy(), AchievementCriteriaData::Meets(), and boss_headless_horseman::UpdateAI().

◆ HasAuraState()

bool Unit::HasAuraState ( AuraStateType  flag,
SpellInfo const *  spellProto = nullptr,
Unit const *  Caster = nullptr 
) const
10539{
10540 if (Caster)
10541 {
10542 if (spellProto)
10543 {
10544 AuraEffectList const& stateAuras = Caster->GetAuraEffectsByType(SPELL_AURA_ABILITY_IGNORE_AURASTATE);
10545 for (AuraEffectList::const_iterator j = stateAuras.begin(); j != stateAuras.end(); ++j)
10546 if ((*j)->IsAffectedOnSpell(spellProto))
10547 return true;
10548 }
10549 // Check per caster aura state
10550 // If aura with aurastate by caster not found return false
10551 if ((1 << (flag - 1)) & PER_CASTER_AURA_STATE_MASK)
10552 {
10553 AuraStateAurasMapBounds range = m_auraStateAuras.equal_range(flag);
10554 for (AuraStateAurasMap::const_iterator itr = range.first; itr != range.second; ++itr)
10555 if (itr->second->GetBase()->GetCasterGUID() == Caster->GetGUID())
10556 return true;
10557 return false;
10558 }
10559 }
10560
10561 return HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10562}
@ SPELL_AURA_ABILITY_IGNORE_AURASTATE
Definition: SpellAuraDefines.h:325
std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
Definition: Unit.h:644

References GetAuraEffectsByType(), Object::GetGUID(), Object::HasFlag(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, SPELL_AURA_ABILITY_IGNORE_AURASTATE, and UNIT_FIELD_AURASTATE.

Referenced by Player::_addSpell(), Pet::addSpell(), Spell::CheckCast(), spell_sha_earthliving_weapon::CheckProc(), SpellInfo::CheckTarget(), ClearAllReactives(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), isFrozen(), Player::LoadFromDB(), MeleeDamageBonusDone(), SpellPctDamageModsDone(), SpellTakenCritChance(), and UpdateReactives().

◆ HasAuraType()

bool Unit::HasAuraType ( AuraType  auraType) const
5706{
5707 return (!m_modAuras[auraType].empty());
5708}

References m_modAuras.

Referenced by ApplyTotalThreatModifier(), Attack(), Creature::CanCreatureAttack(), Player::CanTameExoticPets(), spell_q11010_q11102_q11023_q11008_check_fly_mount::CheckRequirement(), SpellInfo::CheckTarget(), Creature::DoFleeToGetAssistance(), Spell::DoSpellHitOnUnit(), Player::DurabilityPointsLoss(), Spell::EffectStuck(), Spell::EffectWeaponDmg(), npc_wild_wyrm::npc_wild_wyrmAI::EnterEvadeMode(), spell_suppression_aura::FilterTargets(), Player::GetAurasForTarget(), Player::getMaxTimer(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraAllowOnlyAbility(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraEmpathy(), AuraEffect::HandleAuraFeatherFall(), AuraEffect::HandleAuraGhost(), AuraEffect::HandleAuraHover(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModPacifyAndSilence(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraModSilence(), AuraEffect::HandleAuraModStalked(), AuraEffect::HandleAuraTrackStealthed(), AuraEffect::HandleAuraUntrackable(), AuraEffect::HandleAuraWaterWalk(), AuraEffect::HandleComprehendLanguage(), AuraEffect::HandleDetectAmore(), spell_item_reindeer_transformation::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), Player::HandleFall(), AuraEffect::HandleForceMoveForward(), WorldSession::HandleMirrorImageDataRequest(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModInvisibilityDetect(), AuraEffect::HandleModStealth(), AuraEffect::HandleModStealthDetect(), AuraEffect::HandleModUnattackable(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePlayerLoginFromDB(), AuraEffect::HandlePreventFleeing(), WorldSession::HandleRepopRequestOpcode(), reset_commandscript::HandleResetStatsOrLevelHelper(), WorldSession::HandleSelfResOpcode(), HasAuraTypeWithFamilyFlags(), HasInvisibilityAura(), HasStealthAura(), isFeared(), SpellArea::IsFitToRequirements(), IsImmunedToDamage(), IsImmunedToSchool(), IsImmunedToSpell(), IsImmunedToSpellEffect(), isInRoots(), isSpellBlocked(), Kill(), Player::KillPlayer(), KnockbackFrom(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), MagicSpellHitResult(), MeleeDamageBonusTaken(), MeleeSpellHitResult(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), LastPhaseIceTombTargetSelector::operator()(), WorldSession::ReadMovementInfo(), Player::Regenerate(), Player::RegenerateAll(), Player::RegenerateHealth(), Battleground::RemovePlayerAtLeave(), Player::RewardHonor(), RollMeleeOutcomeAgainst(), PetAI::SelectNextTarget(), Player::SendInitialPacketsAfterAddToMap(), SetControlled(), SpellDamageBonusTaken(), SpellTakenCritChance(), Player::Update(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), Creature::UpdateMovementFlags(), and Player::UpdateTriggerVisibility().

◆ HasAuraTypeWithAffectMask()

bool Unit::HasAuraTypeWithAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
5739{
5740 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5741 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5742 if ((*i)->IsAffectedOnSpell(affectedSpell))
5743 return true;
5744 return false;
5745}

References GetAuraEffectsByType().

Referenced by AuraEffect::CalculatePeriodic(), Spell::DoSpellHitOnUnit(), Spell::handle_immediate(), Aura::RefreshDuration(), and Aura::RefreshTimersWithMods().

◆ HasAuraTypeWithCaster()

bool Unit::HasAuraTypeWithCaster ( AuraType  auratype,
ObjectGuid  caster 
) const
5711{
5712 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5713 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5714 if (caster == (*i)->GetCasterGUID())
5715 return true;
5716 return false;
5717}

References GetAuraEffectsByType().

Referenced by BuildValuesUpdate(), IsAlwaysDetectableFor(), PatchValuesUpdate(), and ThreatContainer::SelectNextVictim().

◆ HasAuraTypeWithFamilyFlags()

bool Unit::HasAuraTypeWithFamilyFlags ( AuraType  auraType,
uint32  familyName,
uint32  familyFlags 
) const
766{
767 if (!HasAuraType(auraType))
768 return false;
769 AuraEffectList const& auras = GetAuraEffectsByType(auraType);
770 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
771 if (SpellInfo const* iterSpellProto = (*itr)->GetSpellInfo())
772 if (iterSpellProto->SpellFamilyName == familyName && iterSpellProto->SpellFamilyFlags[0] & familyFlags)
773 return true;
774 return false;
775}

References GetAuraEffectsByType(), and HasAuraType().

◆ HasAuraTypeWithMiscvalue()

bool Unit::HasAuraTypeWithMiscvalue ( AuraType  auratype,
int32  miscvalue 
) const
5730{
5731 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5732 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5733 if (miscvalue == (*i)->GetMiscValue())
5734 return true;
5735 return false;
5736}

References GetAuraEffectsByType().

Referenced by Player::Regenerate(), Player::UpdateManaRegen(), and Player::UpdateStats().

◆ HasAuraTypeWithTriggerSpell()

bool Unit::HasAuraTypeWithTriggerSpell ( AuraType  auratype,
uint32  triggerSpell 
) const
5757{
5758 for (AuraEffect const* aura : GetAuraEffectsByType(auratype))
5759 {
5760 if (aura->GetSpellInfo()->Effects[aura->GetEffIndex()].TriggerSpell == triggerSpell)
5761 {
5762 return true;
5763 }
5764 }
5765
5766 return false;
5767}

References GetAuraEffectsByType().

Referenced by WorldSession::HandlePetActionHelper().

◆ HasAuraTypeWithValue()

bool Unit::HasAuraTypeWithValue ( AuraType  auratype,
int32  value 
) const
5748{
5749 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5750 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5751 if (value == (*i)->GetAmount())
5752 return true;
5753 return false;
5754}

References GetAuraEffectsByType().

◆ HasAuraWithMechanic()

bool Unit::HasAuraWithMechanic ( uint32  mechanicMask) const
5793{
5794 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5795 {
5796 SpellInfo const* spellInfo = iter->second->GetBase()->GetSpellInfo();
5797 if (spellInfo->Mechanic && (mechanicMask & (1 << spellInfo->Mechanic)))
5798 return true;
5799
5800 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5801 if (iter->second->HasEffect(i) && spellInfo->Effects[i].Effect && spellInfo->Effects[i].Mechanic)
5802 if (mechanicMask & (1 << spellInfo->Effects[i].Mechanic))
5803 return true;
5804 }
5805
5806 return false;
5807}

References SpellInfo::Effects, m_appliedAuras, MAX_SPELL_EFFECTS, and SpellInfo::Mechanic.

Referenced by EarthenPowerTargetSelector::operator()(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ HasBreakableByDamageAuraType()

bool Unit::HasBreakableByDamageAuraType ( AuraType  type,
uint32  excludeAura = 0 
) const
778{
779 AuraEffectList const& auras = GetAuraEffectsByType(type);
780 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
781 if ((!excludeAura || excludeAura != (*itr)->GetSpellInfo()->Id) && //Avoid self interrupt of channeled Crowd Control spells like Seduction
782 ((*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE))
783 return true;
784 return false;
785}

References AURA_INTERRUPT_FLAG_TAKE_DAMAGE, and GetAuraEffectsByType().

Referenced by HasBreakableByDamageCrowdControlAura().

◆ HasBreakableByDamageCrowdControlAura()

bool Unit::HasBreakableByDamageCrowdControlAura ( Unit excludeCasterChannel = nullptr) const
788{
789 uint32 excludeAura = 0;
790 if (Spell* currentChanneledSpell = excludeCasterChannel ? excludeCasterChannel->GetCurrentSpell(CURRENT_CHANNELED_SPELL) : nullptr)
791 excludeAura = currentChanneledSpell->GetSpellInfo()->Id; //Avoid self interrupt of channeled Crowd Control spells like Seduction
792
798}
@ SPELL_AURA_MOD_FEAR
Definition: SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition: SpellAuraDefines.h:89
@ SPELL_AURA_TRANSFORM
Definition: SpellAuraDefines.h:119
@ SPELL_AURA_MOD_CONFUSE
Definition: SpellAuraDefines.h:68
@ SPELL_AURA_MOD_STUN
Definition: SpellAuraDefines.h:75
bool HasBreakableByDamageAuraType(AuraType type, uint32 excludeAura=0) const
Definition: Unit.cpp:777
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition: Unit.h:1468

References CURRENT_CHANNELED_SPELL, GetCurrentSpell(), HasBreakableByDamageAuraType(), SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, and SPELL_AURA_TRANSFORM.

Referenced by PetAI::CanAttack(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), CasterAI::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), and PetAI::UpdateAI().

◆ HasExtraUnitMovementFlag()

uint16 Unit::HasExtraUnitMovementFlag ( uint16  f) const
inline

◆ HasInvisibilityAura()

bool Unit::HasInvisibilityAura ( ) const
inline

◆ HasMainhandWeapon()

bool Unit::HasMainhandWeapon ( ) const
inline
1057{ return HasWeapon(BASE_ATTACK); }
virtual bool HasWeapon(WeaponAttackType type) const =0

References BASE_ATTACK, and HasWeapon().

◆ hasMainhandWeaponForAttack()

bool Unit::hasMainhandWeaponForAttack ( ) const
inline
virtual bool HasWeaponForAttack(WeaponAttackType type) const
Definition: Unit.h:1062

References BASE_ATTACK, and HasWeaponForAttack().

◆ HasMainhandWeaponForAttack()

bool Unit::HasMainhandWeaponForAttack ( ) const
inline

◆ HasNegativeAuraWithAttribute()

bool Unit::HasNegativeAuraWithAttribute ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5782{
5783 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5784 {
5785 Aura const* aura = iter->second->GetBase();
5786 if (!iter->second->IsPositive() && aura->GetSpellInfo()->Attributes & flag && (!guid || aura->GetCasterGUID() == guid))
5787 return true;
5788 }
5789 return false;
5790}
uint32 Attributes
Definition: SpellInfo.h:324

References SpellInfo::Attributes, Aura::GetCasterGUID(), Aura::GetSpellInfo(), and m_appliedAuras.

◆ HasNegativeAuraWithInterruptFlag()

bool Unit::HasNegativeAuraWithInterruptFlag ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5770{
5771 if (!(m_interruptMask & flag))
5772 return false;
5773 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end(); ++iter)
5774 {
5775 if (!(*iter)->IsPositive() && (*iter)->GetBase()->GetSpellInfo()->AuraInterruptFlags & flag && (!guid || (*iter)->GetBase()->GetCasterGUID() == guid))
5776 return true;
5777 }
5778 return false;
5779}

References m_interruptableAuras, and m_interruptMask.

Referenced by ThreatContainer::SelectNextVictim().

◆ HasNpcFlag()

bool Unit::HasNpcFlag ( NPCFlags  flags) const
inline

◆ HasOffhandWeapon()

bool Unit::HasOffhandWeapon ( ) const
inline
1058{ return HasWeapon(OFF_ATTACK); }

References HasWeapon(), and OFF_ATTACK.

◆ HasOffhandWeaponForAttack()

◆ HasRangedWeapon()

bool Unit::HasRangedWeapon ( ) const
inline
1059{ return HasWeapon(RANGED_ATTACK); }

References HasWeapon(), and RANGED_ATTACK.

◆ HasRangedWeaponForAttack()

bool Unit::HasRangedWeaponForAttack ( ) const
inline

◆ HasSharedVision()

◆ HasSpell()

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

virtual bool Unit::HasSpellItemCooldown ( uint32  ,
uint32   
) const
inlinevirtual

Reimplemented in Player.

1742{ return false; }

Referenced by Spell::CheckCast(), and ProcDamageAndSpellFor().

◆ HasStealthAura()

◆ HasUnitFlag()

bool Unit::HasUnitFlag ( UnitFlags  flags) const
inline
682{ return HasFlag(UNIT_FIELD_FLAGS, flags); }

References Object::HasFlag(), and UNIT_FIELD_FLAGS.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), Vehicle::AddPassenger(), AttackerStateUpdate(), boss_malygos::boss_malygosAI::AttackStart(), SmartAI::AttackStart(), npc_halazzi_lynx::AttackStart(), npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), violet_hold_trashAI::AttackStart(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::AttackStart(), npc_ravenous_worg::npc_ravenous_worgAI::AttackStart(), npc_swarm_scarab::npc_swarm_scarabAI::CanAIAttack(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanNoReagentCast(), CanSwim(), CanUseAttackType(), Spell::CheckEffectTarget(), boss_muru::boss_muruAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_jormungarAI::DoAction(), Spell::DoSpellHitOnUnit(), RandomMovementGenerator< T >::DoUpdate(), boss_dorothee::EnterEvadeMode(), boss_roar::EnterEvadeMode(), boss_strawman::EnterEvadeMode(), boss_tinhead::EnterEvadeMode(), boss_julianne::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GetReactionTo(), GetVelocity(), spell_gen_model_visible::HandleEffectApply(), WorldSession::HandleMovementOpcodes(), spell_gen_mounted_charge::HandleScriptEffect(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsMounted(), IsPetInCombat(), isTargetableForAttack(), violet_hold_trashAI::JustEngagedWith(), boss_novos::boss_novosAI::JustSummoned(), Condition::Meets(), MotionMaster::MoveCharge(), MotionMaster::MoveChase(), MotionMaster::MoveConfused(), MotionMaster::MoveDistract(), MotionMaster::MoveFall(), MotionMaster::MoveFleeing(), MotionMaster::MoveFollow(), boss_professor_putricide::boss_professor_putricideAI::MoveInLineOfSight(), boss_palehoof::boss_palehoofAI::MoveInLineOfSight(), npc_massive_jormungar::npc_massive_jormungarAI::MoveInLineOfSight(), npc_ferocious_rhino::npc_ferocious_rhinoAI::MoveInLineOfSight(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::MoveInLineOfSight(), npc_frenzied_worgen::npc_frenzied_worgenAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), npc_nether_drake::npc_nether_drakeAI::MoveInLineOfSight(), MotionMaster::MoveLand(), MotionMaster::MovePath(), MotionMaster::MovePoint(), MotionMaster::MoveRandom(), MotionMaster::MoveSeekAssistance(), MotionMaster::MoveSeekAssistanceDistract(), MotionMaster::MoveSplinePath(), MotionMaster::MoveTakeoff(), MotionMaster::MoveTargetedHome(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::myCanCast(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::RefreshSwimmingFlag(), ScriptedAI::SelectSpell(), Player::SetClientControl(), SetSpeed(), boss_the_lurker_below::SummonedCreatureDies(), Player::Update(), npc_onyxian_lair_guard::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_heart::npc_xt002_heartAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), npc_ravenous_worg::npc_ravenous_worgAI::UpdateAI(), and Player::UpdateTriggerVisibility().

◆ HasUnitFlag2()

◆ HasUnitMovementFlag()

◆ HasUnitState()

bool Unit::HasUnitState ( const uint32  f) const
inline
673{ return (m_state & f); }

References m_state.

Referenced by Spell::_cast(), Creature::_IsTargetAcceptable(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), AddThreat(), Attack(), AttackerStateUpdate(), FollowerAI::AttackStart(), npc_raging_spirit::npc_raging_spiritAI::AttackStart(), boss_alar::boss_alar(), boss_anetheron::boss_anetheron(), boss_anzu::boss_anzu(), boss_apothecary_hummel::boss_apothecary_hummelAI::boss_apothecary_hummelAI(), boss_archimonde::boss_archimonde(), boss_azgalor::boss_azgalor(), boss_azuregos::boss_azuregosAI::boss_azuregosAI(), boss_balinda::boss_balinda(), boss_bigbadwolf::boss_bigbadwolf(), boss_blackheart_the_inciter::boss_blackheart_the_inciter(), boss_blindeye_the_seer::boss_blindeye_the_seer(), boss_captain_skarloc::boss_captain_skarloc(), boss_curator::boss_curator(), boss_darkweaver_syth::boss_darkweaver_syth(), boss_dorothee::boss_dorothee(), boss_exarch_maladaar::boss_exarch_maladaar(), boss_fathomguard_caribdis::boss_fathomguard_caribdis(), boss_fathomguard_sharkkis::boss_fathomguard_sharkkis(), boss_fathomguard_tidalvess::boss_fathomguard_tidalvess(), boss_ghazan::boss_ghazan(), boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurse(), boss_halazzi::boss_halazzi(), boss_high_astromancer_solarian::boss_high_astromancer_solarian(), boss_high_king_maulgar::boss_high_king_maulgar(), boss_jarien::boss_jarien(), boss_kazrogal::boss_kazrogal(), boss_kelidan_the_breaker::boss_kelidan_the_breaker(), boss_kiggler_the_crazed::boss_kiggler_the_crazed(), boss_krosh_firehand::boss_krosh_firehand(), boss_lady_vashj::boss_lady_vashj(), boss_magtheridon::boss_magtheridon(), boss_maiden_of_virtue::boss_maiden_of_virtue(), boss_mekgineer_steamrigger::boss_mekgineer_steamrigger(), boss_mennu_the_betrayer::boss_mennu_the_betrayer(), boss_mor_grayhoof::boss_mor_grayhoof(), boss_moroes::boss_moroes(), boss_morogrim_tidewalker::boss_morogrim_tidewalker(), boss_murmur::boss_murmur(), boss_nazan::boss_nazan(), boss_nexusprince_shaffar::boss_nexusprince_shaffar(), boss_olm_the_summoner::boss_olm_the_summoner(), boss_omor_the_unscarred::boss_omor_the_unscarred(), boss_pandemonius::boss_pandemonius(), boss_quagmirran::boss_quagmirran(), boss_rage_winterchill::boss_rage_winterchill(), boss_roar::boss_roar(), boss_rokmar_the_crackler::boss_rokmar_the_crackler(), boss_shirrak_the_dead_watcher::boss_shirrak_the_dead_watcher(), boss_sothos::boss_sothos(), boss_strawman::boss_strawman(), boss_supremus::boss_supremus(), boss_swamplord_muselek::boss_swamplord_muselek(), boss_talon_king_ikiss::boss_talon_king_ikiss(), boss_tavarok::boss_tavarok(), boss_terestian_illhoof::boss_terestian_illhoof(), boss_the_black_stalker::boss_the_black_stalker(), boss_the_maker::boss_the_maker(), boss_tinhead::boss_tinhead(), boss_vazruden::boss_vazruden(), boss_void_reaver::boss_void_reaver(), boss_warbringer_omrogg::boss_warbringer_omrogg(), boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefist(), boss_watchkeeper_gargolmar::boss_watchkeeper_gargolmar(), PathGenerator::CalculatePath(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), boss_gurtogg_bloodboil::CanAIAttack(), PetAI::CanAttack(), Player::CanEquipItem(), CanFreeMove(), Creature::CanPeriodicallyCallForAssistance(), Creature::CanStartAttack(), spell_dk_death_grip::CheckCast(), Spell::CheckCast(), Spell::CheckPetCast(), spell_warr_retaliation::CheckProc(), CreatureUnitRelocationWorker(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), DealDamage(), DealMeleeDamage(), DisableRotate(), UnitAI::DoCast(), UnitAI::DoCastAOE(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), Spell::DoSpellHitOnUnit(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), Spell::EffectDistract(), Spell::EffectKnockBack(), CritterAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Spell::finish(), Player::GetInitialVisiblePackets(), WorldSession::HandleAuctionListItems(), spell_dru_starfall_dummy::HandleDummy(), WorldSession::HandleEmoteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleMoveTeleportAck(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), AuraEffect::HandleProcTriggerDamageAuraProc(), ArenaSpectator::HandleSpectatorSpectateCommand(), boss_venoxis::InitializeAI(), isAttackingPlayer(), boss_faction_championsAI::IsCCed(), Creature::IsInEvadeMode(), IsInFlight(), IsMovementPreventedByCasting(), Creature::IsMovementPreventedByCasting(), isPossessed(), isPossessedByPlayer(), isSpellBlocked(), IsStopped(), isTargetableForAttack(), IsValidCombatTarget(), CritterAI::JustEngagedWith(), npc_coren_direbrew_sisters::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), boss_essence_of_desire::boss_essence_of_desireAI::JustEngagedWith(), PetAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), LoadHelper(), MagicSpellHitResult(), MeleeSpellHitResult(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_hunter::npc_toc_hunterAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_warrior::npc_toc_warriorAI::myCanCast(), npc_toc_dk::npc_toc_dkAI::myCanCast(), npc_toc_rogue::npc_toc_rogueAI::myCanCast(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::myCanCast(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::myCanCast(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_apothecary_baxter::npc_apothecary_baxter(), npc_batrider::npc_batrider(), npc_capernian::npc_capernian(), npc_hyjal_frost_wyrm::npc_hyjal_frost_wyrm(), npc_hyjal_gargoyle::npc_hyjal_gargoyle(), npc_hyjal_ground_trash::npc_hyjal_ground_trash(), npc_icc_spire_frostwyrm::npc_icc_spire_frostwyrm(), npc_inner_demon::npc_inner_demon(), npc_lord_sanguinar::npc_lord_sanguinar(), npc_telonicus::npc_telonicus(), npc_thaladred::npc_thaladred(), Acore::FriendlyCCedInRange::operator()(), SmartScript::ProcessAction(), RemoveCharmedBy(), boss_kormok::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), npc_ohgan::npc_ohganAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_isalien::Reset(), npc_anubisath_guardian::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_ashtongue_channeler::Reset(), RollMeleeOutcomeAgainst(), boss_faction_championsAI::SelectEnemyCaster(), Player::SetClientControl(), SetContestedPvP(), SetControlled(), Creature::SetDisableGravity(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Creature::SetHover(), SetInCombatState(), SetInFront(), SetRooted(), SetStunned(), WaypointMovementGenerator< Creature >::StartMove(), lfg::LFGMgr::TeleportPlayer(), CreatureAI::TriggerAlert(), Player::Update(), Update(), TimedFleeingMovementGenerator::Update(), boss_sartharion_dragonAI::UpdateAI(), CombatAI::UpdateAI(), CasterAI::UpdateAI(), BossAI::UpdateAI(), WorldBossAI::UpdateAI(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::UpdateAI(), ironhand_guardian::ironhand_guardianAI::UpdateAI(), boss_anubshiah::boss_anubshiahAI::UpdateAI(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::UpdateAI(), boss_eviscerator::boss_evisceratorAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_moira_bronzebeardAI::UpdateAI(), boss_high_priestess_thaurissanAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_halycon::boss_halyconAI::UpdateAI(), boss_highlord_omokk::boss_highlordomokkAI::UpdateAI(), boss_lord_valthalak::boss_lord_valthalakAI::UpdateAI(), boss_overlord_wyrmthalak::boss_overlordwyrmthalakAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_solakar_flamewreath::boss_solakar_flamewreathAI::UpdateAI(), boss_the_beast::boss_thebeastAI::UpdateAI(), boss_urok_doomhowl::boss_urok_doomhowlAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_chromaggus::boss_chromaggusAI::UpdateAI(), boss_ebonroc::boss_ebonrocAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_nefarian::UpdateAI(), boss_razorgore::boss_razorgoreAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_garr::boss_garrAI::UpdateAI(), boss_golemagg::boss_golemaggAI::UpdateAI(), npc_core_rager::npc_core_ragerAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_flamewaker_priest::npc_flamewaker_priestAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), boss_netherspite::UpdateAI(), boss_servant_quarters::UpdateAI(), npc_kilrek::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), boss_priestess_delrissa::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), boss_kagani_nightstrike::UpdateAI(), boss_selin_fireheart::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_brutallus::boss_brutallusAI::UpdateAI(), boss_sacrolash::boss_sacrolashAI::UpdateAI(), boss_alythess::boss_alythessAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kalec::boss_kalecAI::UpdateAI(), boss_sathrovarr::boss_sathrovarrAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), boss_muru::boss_muruAI::UpdateAI(), boss_entropius::boss_entropiusAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), boss_blight_worm::boss_blight_wormAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_gahzranka::boss_gahzrankaAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_coren_direbrew::UpdateAI(), npc_hallows_end_soh::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), boss_onyxia::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), npc_belnistrasz::npc_belnistraszAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_volazj::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), boss_taldaram::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), npc_rotting_frost_giant::npc_rotting_frost_giantAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_captain_arnath::npc_captain_arnathAI::UpdateAI(), npc_captain_brandon::npc_captain_brandonAI::UpdateAI(), npc_captain_grondel::npc_captain_grondelAI::UpdateAI(), npc_captain_rupert::npc_captain_rupertAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_anubrekhan::boss_anubrekhanAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razuvious_minion::boss_razuvious_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), boss_anomalus::boss_anomalusAI::UpdateAI(), boss_commander_stoutbeard::boss_commander_stoutbeardAI::UpdateAI(), boss_keristrasza::boss_keristraszaAI::UpdateAI(), boss_magus_telestra::boss_magus_telestraAI::UpdateAI(), boss_ormorok::boss_ormorokAI::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), boss_keleseth::boss_kelesethAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::UpdateAI(), boss_dalronn_the_controller::boss_dalronn_the_controllerAI::UpdateAI(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_exarch_maladaar::UpdateAI(), boss_nexusprince_shaffar::UpdateAI(), npc_yor::UpdateAI(), boss_anzu::UpdateAI(), npc_maiev_illidan::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_high_nethermancer_zerevor::UpdateAI(), boss_lady_malande::UpdateAI(), boss_veras_darkshadow::UpdateAI(), boss_essence_of_suffering::boss_essence_of_sufferingAI::UpdateAI(), boss_essence_of_desire::boss_essence_of_desireAI::UpdateAI(), boss_essence_of_anger::boss_essence_of_angerAI::UpdateAI(), boss_doomlord_kazzak::boss_doomlordkazzakAI::UpdateAI(), boss_doomwalker::UpdateAI(), boss_leotheras_the_blind::UpdateAI(), boss_gruul::UpdateAI(), boss_the_maker::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), boss_watchkeeper_gargolmar::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_lord_sanguinar::UpdateAI(), npc_capernian::UpdateAI(), npc_telonicus::UpdateAI(), npc_maghar_captive::npc_maghar_captiveAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), emerald_dragonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), PetAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_wg_spirit_guide::npc_wg_spirit_guideAI::UpdateAI(), Player::UpdateCharmedAI(), npc_general_andorov::UpdateEscortAI(), npc_onyx_flamecaller::npc_onyx_flamecallerAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), npc_kurenai_captive::npc_kurenai_captiveAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), SmartAI::UpdatePath(), and SmartScript::UpdateTimer().

◆ HasUnitTypeMask()

◆ HasVisibleAuraType()

bool Unit::HasVisibleAuraType ( AuraType  auraType) const
5720{
5721 AuraEffectList const& mAuraList = GetAuraEffectsByType(auraType);
5722 for (AuraEffectList::const_iterator i = mAuraList.begin(); i != mAuraList.end(); ++i)
5723 if ((*i)->GetBase()->CanBeSentToClient())
5724 return true;
5725
5726 return false;
5727}

References GetAuraEffectsByType().

◆ HasWeapon()

virtual bool Unit::HasWeapon ( WeaponAttackType  type) const
pure virtual

Implemented in Creature, and Player.

Referenced by HasMainhandWeapon(), HasOffhandWeapon(), and HasRangedWeapon().

◆ HasWeaponForAttack()

virtual bool Unit::HasWeaponForAttack ( WeaponAttackType  type) const
inlinevirtual

Reimplemented in Creature, and Player.

1062{ return CanUseAttackType(type); }
bool CanUseAttackType(uint8 attacktype) const
Definition: Unit.h:1066

References CanUseAttackType().

Referenced by hasMainhandWeaponForAttack(), HasMainhandWeaponForAttack(), HasOffhandWeaponForAttack(), HasRangedWeaponForAttack(), Creature::HasWeaponForAttack(), and Player::HasWeaponForAttack().

◆ haveOffhandWeapon()

bool Unit::haveOffhandWeapon ( ) const
522{
523 if (Player const* player = ToPlayer())
524 return player->GetWeaponForAttack(OFF_ATTACK, true);
525
526 return CanDualWield();
527}
bool CanDualWield() const
Definition: Unit.h:768

References CanDualWield(), OFF_ATTACK, and Object::ToPlayer().

Referenced by boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), and boss_twin_valkyrAI::myDoMeleeAttackIfReady().

◆ HealBySpell()

int32 Unit::HealBySpell ( HealInfo healInfo,
bool  critical = false 
)
11231{
11232 uint32 heal = healInfo.GetHeal();
11233 sScriptMgr->ModifyHealReceived(this, healInfo.GetTarget(), heal, healInfo.GetSpellInfo());
11234 healInfo.SetHeal(heal);
11235
11236 // calculate heal absorb and reduce healing
11237 CalcHealAbsorb(healInfo);
11238
11239 int32 gain = Unit::DealHeal(healInfo.GetHealer(), healInfo.GetTarget(), healInfo.GetHeal());
11240 healInfo.SetEffectiveHeal(gain);
11241
11242 SendHealSpellLog(healInfo, critical);
11243 return gain;
11244}
Unit * GetHealer() const
Definition: Unit.h:410
void SetHeal(uint32 amount)
Definition: Unit.h:400
void SetEffectiveHeal(uint32 amount)
Definition: Unit.h:405
static void CalcHealAbsorb(HealInfo &healInfo)
Definition: Unit.cpp:2502
static int32 DealHeal(Unit *healer, Unit *victim, uint32 addhealth)
Definition: Unit.cpp:10937
void SendHealSpellLog(HealInfo const &healInfo, bool critical=false)
Definition: Unit.cpp:11213

References CalcHealAbsorb(), DealHeal(), HealInfo::GetHeal(), HealInfo::GetHealer(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SendHealSpellLog(), HealInfo::SetEffectiveHeal(), HealInfo::SetHeal(), and sScriptMgr.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ HealthAbovePct()

◆ HealthAbovePctHealed()

bool Unit::HealthAbovePctHealed ( int32  pct,
uint32  heal 
) const
inline

◆ HealthBelowPct()

bool Unit::HealthBelowPct ( int32  pct) const
inline
873{ return GetHealth() < CountPctFromMaxHealth(pct); }

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_moira_bronzebeardAI::CastOnEmperorIfPossible(), boss_mor_grayhoof::DamageTaken(), boss_isalien::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), HandleProcTriggerSpell(), ScriptedAI::HealthBelowPct(), npc_akama_illidan::JustEngagedWith(), npc_maiev_illidan::JustEngagedWith(), boss_olm_the_summoner::JustEngagedWith(), boss_grand_warlock_nethekurse::JustEngagedWith(), Player::LoadFromDB(), npc_death_knight_initiate::OnGossipHello(), SetHealth(), SpellPctHealingModsDone(), Update(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kalec::boss_kalecAI::UpdateAI(), boss_sathrovarr::boss_sathrovarrAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_anomalus::boss_anomalusAI::UpdateAI(), boss_keristrasza::boss_keristraszaAI::UpdateAI(), boss_magus_telestra::boss_magus_telestraAI::UpdateAI(), boss_ormorok::boss_ormorokAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), and npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI().

◆ HealthBelowPctDamaged()

bool Unit::HealthBelowPctDamaged ( int32  pct,
uint32  damage 
) const
inline
874{ return int64(GetHealth()) - int64(damage) < int64(CountPctFromMaxHealth(pct)); }
std::int64_t int64
Definition: Define.h:102

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_mandokir::boss_mandokirAI::DamageDealt(), boss_gyth::boss_gythAI::DamageTaken(), boss_lord_valthalak::boss_lord_valthalakAI::DamageTaken(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::DamageTaken(), boss_quartermaster_zigris::DamageTaken(), boss_warmaster_voone::boss_warmastervooneAI::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_golemagg::boss_golemaggAI::DamageTaken(), npc_core_rager::npc_core_ragerAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_kormok::DamageTaken(), npc_batrider::DamageTaken(), npc_coren_direbrew::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_onyxia::DamageTaken(), npc_anubisath_guardian::DamageTaken(), boss_ouro::DamageTaken(), npc_anubisath_sentinel::aqsentinelAI::DamageTaken(), npc_anubisath_defender::DamageTaken(), boss_elder_nadox::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), npc_xt002_boombot::npc_xt002_boombotAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_vazruden::DamageTaken(), npc_millhouse_manastorm::npc_millhouse_manastormAI::DamageTaken(), npc_magister_aledis::DamageTaken(), BossAI::DamageTaken(), boss_buru::DamageTaken(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), boss_bug_trio::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), and HandleProcTriggerSpell().

◆ IncrDiminishing()

void Unit::IncrDiminishing ( DiminishingGroup  group)
15020{
15021 // Checking for existing in the table
15022 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15023 {
15024 if (i->DRGroup != group)
15025 continue;
15026 if (int32(i->hitCount) < GetDiminishingReturnsMaxLevel(group))
15027 i->hitCount += 1;
15028 return;
15029 }
15031}
DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group)
Definition: SpellMgr.cpp:264
Definition: Unit.h:272

References DIMINISHING_LEVEL_2, GetDiminishingReturnsMaxLevel(), GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ InitCharmInfo()

CharmInfo * Unit::InitCharmInfo ( )
15799{
15800 if (!m_charmInfo)
15801 m_charmInfo = new CharmInfo(this);
15802
15803 return m_charmInfo;
15804}
Definition: CharmInfo.h:125

References m_charmInfo.

Referenced by Guardian::Guardian(), Pet::Pet(), and SetCharmedBy().

◆ InitStatBuffMods()

void Unit::InitStatBuffMods ( )
inline
1437 {
1438 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + i, 0);
1439 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + i, 0);
1440 }

References STAT_STRENGTH, UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::InitStatsForLevel().

◆ InitTamedPet()

bool Unit::InitTamedPet ( Pet pet,
uint8  level,
uint32  spell_id 
)
17383{
17384 Player* player = ToPlayer();
17385 PetStable& petStable = player->GetOrInitPetStable();
17386 if (petStable.CurrentPet || petStable.GetUnslottedHunterPet())
17387 return false;
17388
17389 pet->SetCreatorGUID(GetGUID());
17390 pet->SetFaction(GetFaction());
17391 pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, spell_id);
17392
17393 if (IsPlayer())
17395
17396 if (!pet->InitStatsForLevel(level))
17397 {
17398 LOG_ERROR("entities.unit", "Pet::InitStatsForLevel() failed for creature (Entry: {})!", pet->GetEntry());
17399 return false;
17400 }
17401
17402 pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
17403 // this enables pet details window (Shift+P)
17404 pet->InitPetCreateSpells();
17405 pet->SetFullHealth();
17406 pet->FillPetInfo(&petStable.CurrentPet.emplace());
17407 return true;
17408}
@ UNIT_CREATED_BY_SPELL
Definition: UpdateFields.h:138
bool InitStatsForLevel(uint8 level)
Definition: Pet.cpp:1021
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition: Pet.cpp:2474
void InitPetCreateSpells()
Definition: Pet.cpp:2049
Definition: PetDefines.h:202
PetInfo const * GetUnslottedHunterPet() const
Definition: PetDefines.h:230
Optional< PetInfo > CurrentPet
Definition: PetDefines.h:225
PetStable & GetOrInitPetStable()
Definition: Player.cpp:15587
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition: CharmInfo.cpp:240
void SetFullHealth()
Definition: Unit.h:884
void SetFaction(uint32 faction)
Definition: Unit.cpp:10047
void ReplaceAllUnitFlags(UnitFlags flags)
Remove the Unit flag specify only.
Definition: Unit.h:685
CharmInfo * GetCharmInfo()
Definition: Unit.h:1290
void SetCreatorGUID(ObjectGuid creator)
Definition: Unit.h:1225

References PetStable::CurrentPet, Pet::FillPetInfo(), GetCharmInfo(), Object::GetEntry(), GetFaction(), Object::GetGUID(), Player::GetOrInitPetStable(), PetStable::GetUnslottedHunterPet(), Pet::InitPetCreateSpells(), Guardian::InitStatsForLevel(), Object::IsPlayer(), LOG_ERROR, ReplaceAllUnitFlags(), SetCreatorGUID(), SetFaction(), SetFullHealth(), CharmInfo::SetPetNumber(), SetUInt32Value(), sObjectMgr, Object::ToPlayer(), UNIT_CREATED_BY_SPELL, and UNIT_FLAG_PLAYER_CONTROLLED.

Referenced by CreateTamedPetFrom().

◆ InterruptNonMeleeSpells()

void Unit::InterruptNonMeleeSpells ( bool  withDelayed,
uint32  spellid = 0,
bool  withInstant = true,
bool  bySelf = false 
)
4130{
4131 // generic spells are interrupted if they are not finished or delayed
4132 if (m_currentSpells[CURRENT_GENERIC_SPELL] && (!spell_id || m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->Id == spell_id))
4133 InterruptSpell(CURRENT_GENERIC_SPELL, withDelayed, withInstant, bySelf);
4134
4135 // autorepeat spells are interrupted if they are not finished or delayed
4136 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && (!spell_id || m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id == spell_id))
4137 InterruptSpell(CURRENT_AUTOREPEAT_SPELL, withDelayed, withInstant, bySelf);
4138
4139 // channeled spells are interrupted if they are not finished, even if they are delayed
4140 if (m_currentSpells[CURRENT_CHANNELED_SPELL] && (!spell_id || m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id == spell_id))
4141 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4142}

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, InterruptSpell(), and m_currentSpells.

Referenced by _EnterVehicle(), PetAI::_stopAttack(), Player::ActivateSpec(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), CleanupBeforeRemoveFromMap(), CombatStop(), boss_julianne::DamageTaken(), npc_mograine::npc_mograineAI::DamageTaken(), boss_onyxia::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), DealDamage(), boss_leotheras_the_blind::DemonTime(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_medivh_bm::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_nazan::DoAction(), npc_ranshalla::npc_ranshallaAI::DoContinueEscort(), Spell::EffectKnockBack(), boss_leotheras_the_blind::ElfTime(), spell_dk_death_grip::HandleBaseDummy(), WorldSession::HandleCancelCastOpcode(), spell_magtheridon_shadow_grasp::HandleDummyRemove(), spell_novos_crystal_handler_death_aura::HandleEffectApply(), spell_hydross_cleansing_field_command::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLootOpcode(), WorldSession::HandlePetActionHelper(), spell_the_lich_king_jump::HandleScript(), boss_akilzon::boss_akilzonAI::HandleStormSequence(), npc_kilrek::JustEngagedWith(), boss_archimonde::JustEngagedWith(), boss_infinite_corruptor::boss_infinite_corruptorAI::JustEngagedWith(), boss_taldaram::JustEngagedWith(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_curator::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustEngagedWith(), boss_gal_darah::boss_gal_darahAI::JustEngagedWith(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustEngagedWith(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustEngagedWith(), violet_hold_trashAI::JustEngagedWith(), PetAI::KilledUnit(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_shade_of_aran::OnPowerUpdate(), boss_jeklik::PathEndReached(), npc_akama_illidan::PathEndReached(), PretendToDie(), boss_alar::PretendToDie(), SmartScript::ProcessAction(), RemoveAurasWithInterruptFlags(), boss_curator::Reset(), boss_malchezaar::Reset(), boss_varos::boss_varosAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), boss_talon_king_ikiss::Reset(), boss_high_astromancer_solarian::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), boss_illidan_stormrage::ScheduleAbilities(), boss_the_lurker_below::SchedulerPhaseOne(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), boss_anomalus::boss_anomalusAI::SetData(), setDeathState(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), StopAttackFaction(), Player::TeleportTo(), CasterAI::UpdateAI(), TotemAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and PetAI::UpdateAI().

◆ InterruptSpell()

void Unit::InterruptSpell ( CurrentSpellTypes  spellType,
bool  withDelayed = true,
bool  withInstant = true,
bool  bySelf = false 
)
4061{
4062 //LOG_DEBUG("entities.unit", "Interrupt spell for unit {}.", GetEntry());
4063 Spell* spell = m_currentSpells[spellType];
4064 if (spell
4065 && (withDelayed || spell->getState() != SPELL_STATE_DELAYED)
4066 && (withInstant || spell->GetCastTime() > 0 || spell->getState() == SPELL_STATE_CASTING)) // xinef: or spell is in casting state (channeled spells only)
4067 {
4068 // for example, do not let self-stun aura interrupt itself
4069 if (!spell->IsInterruptable())
4070 return;
4071
4072 // send autorepeat cancel message for autorepeat spells
4073 if (spellType == CURRENT_AUTOREPEAT_SPELL)
4074 if (IsPlayer())
4076
4077 if (spell->getState() != SPELL_STATE_FINISHED)
4078 spell->cancel(bySelf);
4079 else
4080 {
4081 m_currentSpells[spellType] = nullptr;
4082 spell->SetReferencedFromCurrent(false);
4083 }
4084 }
4085}
@ SPELL_STATE_DELAYED
Definition: Spell.h:228
void SendAutoRepeatCancel(Unit *target)
Definition: PlayerMisc.cpp:152
bool IsInterruptable() const
Definition: Spell.h:560
int32 GetCastTime() const
Definition: Spell.h:547
uint32 getState() const
Definition: Spell.h:482
void cancel(bool bySelf=false)
Definition: Spell.cpp:3718

References Spell::cancel(), CURRENT_AUTOREPEAT_SPELL, Spell::GetCastTime(), Spell::getState(), Spell::IsInterruptable(), Object::IsPlayer(), m_currentSpells, Player::SendAutoRepeatCancel(), Spell::SetReferencedFromCurrent(), SPELL_STATE_CASTING, SPELL_STATE_DELAYED, SPELL_STATE_FINISHED, and Object::ToPlayer().

Referenced by _UpdateAutoRepeatSpell(), Player::ActivateTaxiPathTo(), Attack(), AttackStop(), CastStop(), Spell::EffectInterruptCast(), Spell::EffectSanctuary(), AuraEffect::HandleAuraModSilence(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandleCancelAutoRepeatSpellOpcode(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleCancelChanneling(), spell_hun_scatter_shot::HandleDummy(), AuraEffect::HandleFeignDeath(), InterruptNonMeleeSpells(), SmartAI::JustEngagedWith(), Player::RemoveItemDependentAurasAndCasts(), SetCurrentCastedSpell(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_nightbane::TriggerHealthTakeOff(), and npc_belnistrasz::npc_belnistraszAI::UpdateAI().

◆ InvalidateValuesUpdateCache()

void Unit::InvalidateValuesUpdateCache ( )
inlineprivate
1944{ _valuesUpdateCache.clear(); }

References _valuesUpdateCache.

Referenced by SetUInt32Value(), and Update().

◆ IsAlive()

bool Unit::IsAlive ( ) const
inline
1216{ return (m_deathState == DeathState::Alive); };

References m_deathState.

Referenced by _CreateAuraApplication(), CreatureAI::_EnterEvadeMode(), _EnterVehicle(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::_LoadItem(), BossAI::_Reset(), WorldBossAI::_Reset(), KillRewarder::_RewardHonor(), KillRewarder::_RewardKillCredit(), KillRewarder::_RewardXP(), PetAI::_stopAttack(), AddAura(), Map::AddPlayerToMap(), HostileReference::AddThreat(), Spell::AddUnitTarget(), Attack(), PetAI::AttackedBy(), AttackerStateUpdate(), boss_freya::boss_freyaAI::boss_freyaAI(), boss_hodir::boss_hodirAI::boss_hodirAI(), boss_mimiron::boss_mimironAI::boss_mimironAI(), boss_thorim::boss_thorimAI::boss_thorimAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), Player::BuyItemFromVendorSlot(), CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), instance_ruins_of_ahnqiraj::instance_ruins_of_ahnqiraj_InstanceMapScript::CallNextRajaxxLeader(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanCaptureTowerPoint(), CanHaveThreatList(), Player::CanInteractWithQuestGiver(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CanUseItem(), Player::CastItemCombatSpell(), Player::CheckAreaExploreAndOutdoor(), spell_dk_raise_ally::CheckCast(), spell_hun_check_pet_los::CheckCast(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), spell_hun_bestial_wrath::CheckCast(), Spell::CheckCast(), boss_gothik::boss_gothikAI::CheckGroupSplitted(), BattlegroundRV::CheckPositionForUnit(), spell_mage_focus_magic::CheckProc(), spell_dk_blood_caked_blade::CheckProc(), spell_dk_dancing_rune_weapon::CheckProc(), spell_item_necrotic_touch::CheckProc(), spell_pal_seal_of_righteousness::CheckProc(), spell_warl_siphon_life::CheckProc(), spell_putricide_mutation_init::CheckRequirementInternal(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CreatureUnitRelocationWorker(), DealDamage(), DealDamageMods(), DealMeleeDamage(), DealSpellDamage(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), Creature::DisappearAndDie(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_xerestrasza::npc_xerestraszaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), boss_high_king_maulgar::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_infinite_corruptor::boss_infinite_corruptorAI::DoAction(), boss_tharon_ja::boss_tharon_jaAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::DoAllEffectOnTarget(), spell_hun_masters_call::DoCheckCast(), RandomMovementGenerator< T >::DoInitialize(), WorldSession::DoLootRelease(), WaypointMovementGenerator< Creature >::DoUpdate(), instance_blackrock_spire::instance_blackrock_spireMapScript::Dragonspireroomcheck(), Spell::EffectAddExtraAttacks(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectEnvironmentalDMG(), Spell::EffectFeedPet(), Spell::EffectHeal(), Spell::EffectHealMaxHealth(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), Spell::EffectHealthLeech(), Spell::EffectInstaKill(), Spell::EffectInterruptCast(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectResurrect(), Spell::EffectResurrectNew(), Spell::EffectResurrectPet(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSelfResurrect(), Spell::EffectSkinPlayerCorpse(), Spell::EffectStuck(), Spell::EffectThreat(), Spell::EffectWeaponDmg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Player::EnvironmentalDamage(), Player::EquipItem(), BattleExperienceEvent::Execute(), DelayedMovementEvent::Execute(), IceTombSummonEvent::Execute(), SACActivateEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), AssistanceMovementGenerator::Finalize(), Creature::ForcedDespawn(), CreatureGroup::FormationReset(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::GetData(), GetDebugInfo(), Player::GetInitialVisiblePackets(), FollowerAI::GetLeaderForFollower(), Player::getMaxTimer(), CreatureGroup::GetNewTargetForMember(), Player::GetNPCIfCanInteractWith(), GetPartyMembers(), npc_air_force_bots::npc_air_force_botsAI::GetSummonedGuard(), npc_wild_wyrm::npc_wild_wyrmAI::GetValidPlayer(), Pet::GivePetXP(), Player::GiveXP(), go_wind_stone::go_wind_stoneAI::GossipSelect(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), BattlegroundEY::HandleAreaTrigger(), BattlegroundWS::HandleAreaTrigger(), WorldSession::HandleAreaTriggerOpcode(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModTotalThreat(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattleFieldPortOpcode(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), HandleDummyAuraProc(), WorldSession::HandleEmoteOpcode(), Player::HandleFall(), misc_commandscript::HandleFreezeCommand(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMessagechatOpcode(), AuraEffect::HandleModTaunt(), AuraEffect::HandleModTotalPercentStat(), WorldSession::HandleMovementOpcodes(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), AuraEffect::HandleObsModPowerAuraTick(), spell_yogg_saron_brain_link_aura::HandleOnEffectApply(), WorldSession::HandleOpenItemOpcode(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetAction(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandlePetStopAttack(), misc_commandscript::HandlePInfoCommand(), spell_pal_seal_of_command_aura::HandleProc(), HandleProcTriggerSpell(), WorldSession::HandleReclaimCorpseOpcode(), WorldSession::HandleRepopRequestOpcode(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), WorldSession::HandleSetAmmoOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleSummonResponseOpcode(), WorldSession::HandleUnstablePet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), boss_moroes::InitializeGuests(), Player::IsAtGroupRewardDistance(), Player::IsAtRecruitAFriendDistance(), Creature::IsInvisibleDueToDespawn(), Player::IsOutdoorPvPActive(), Player::IsPetNeedBeTemporaryUnsummoned(), isTargetableForAttack(), IsValidCombatTarget(), Spell::IsValidDeadOrAliveTarget(), ThreatCalcHelper::isValidProcess(), npc_kilrek::JustDied(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::JustDied(), boss_rajaxx::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), npc_underbat::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), boss_fathomlord_karathress::JustReachedHome(), boss_rotface::boss_rotfaceAI::JustSummoned(), Kill(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), Player::LoadCorpse(), Player::LoadFromDB(), LoadHelper(), MagicSpellHitResult(), AchievementCriteriaData::Meets(), CreatureGroup::MemberEngagingTarget(), CreatureGroup::MemberEvaded(), npc_twiggy_flathead::npc_twiggy_flatheadAI::MoveInLineOfSight(), boss_lord_marrowgar::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_uldaman::instance_uldaman_InstanceMapScript::OnCreatureCreate(), instance_temple_of_ahnqiraj::instance_temple_of_ahnqiraj_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), instance_shadow_labyrinth::instance_shadow_labyrinth_InstanceMapScript::OnCreatureCreate(), go_palehoof_sphere::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), spell_yogg_saron_brain_link_aura::OnPeriodic(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnPlayerEnter(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), at_orb_of_command::OnTrigger(), at_ancient_leaf::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), AreaTrigger_at_voltarus_middle::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), AreaTrigger_at_sentry_point::OnTrigger(), SmartTrigger::OnTrigger(), AreaTrigger_at_area_52_entrance::OnTrigger(), at_dragonspire_hall::OnTrigger(), at_blackrock_stadium::OnTrigger(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), at_commander_dawnforge::OnTrigger(), RisenArchmageCheck::operator()(), WretchedGhoulCleaner::operator()(), ValithriaDespawner::operator()(), Acore::NearestCreatureEntryWithLiveStateInObjectRangeCheck::operator()(), Acore::PlayerAtMinimumRangeAway::operator()(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), Acore::AnyPlayerInObjectRangeCheck::operator()(), Acore::NearestPlayerInObjectRangeCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::AnyUnitInObjectRangeCheck::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Acore::AnyDeadUnitCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::MostHPMissingGroupInRange::operator()(), FrostwingVrykulSearcher::operator()(), Acore::AllDeadCreaturesInRange::operator()(), ShadowTrapLKTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), DefileTargetSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), MapMgr::PlayerCannotEnter(), ProcDamageAndSpell(), RemoveCharmedBy(), Group::RemoveMember(), Player::RemovePet(), Battleground::RemovePlayerAtLeave(), Player::RepopAtGraveyard(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), boss_fathomlord_karathress::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), Creature::Respawn(), Player::RewardPlayerAndGroupAtEvent(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), Player::SendLoot(), npc_corrupted_totem::SetAura(), instance_naxxramas::instance_naxxramas_InstanceMapScript::SetBossState(), SetConfused(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::SetData(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::SetData(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::SetData(), boss_teron_gorefiend::SetData(), Player::setDeathState(), Creature::SetDisableGravity(), SetFeared(), Creature::SetHover(), SetInCombatState(), SetStunned(), Battlefield::ShowNpc(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::SpawnAdds(), npc_dark_iron_guzzler::SpellHit(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), WaypointMovementGenerator< Creature >::StartMove(), PassengerController::SummonCreatures(), boss_rend_blackhand::boss_rend_blackhandAI::SummonedCreatureDespawn(), boss_priestess_delrissa::SummonedCreatureDies(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), Player::SwapItem(), lfg::LFGMgr::TeleportPlayer(), BattlegroundRV::TeleportUnitToNewZ(), Pet::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Puppet::Update(), Player::Update(), Totem::Update(), Update(), TimedFleeingMovementGenerator::Update(), TotemAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_taldaram::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::UpdateAI(), PetAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_ringo::npc_ringoAI::UpdateFollowerAI(), InstanceScript::UpdateMinionState(), Creature::UpdateMovementFlags(), boss_netherspite::UpdatePortals(), boss_twin_valkyrAI::UpdateSharedHealth(), UpdateSplineMovement(), Player::UpdateZone(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsAlwaysDetectableFor()

bool Unit::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

14201{
14203 return true;
14204
14205 if (HasAuraTypeWithCaster(SPELL_AURA_MOD_STALKED, seer->GetGUID()))
14206 return true;
14207
14208 if (Player* ownerPlayer = GetSpellModOwner())
14209 if (Player const* seerPlayer = seer->ToPlayer())
14210 {
14211 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14212 return true;
14213 }
14214
14215 return false;
14216}
@ SPELL_AURA_MOD_STALKED
Definition: SpellAuraDefines.h:131
virtual bool IsAlwaysDetectableFor(WorldObject const *) const
Definition: Object.h:666

References Object::GetGUID(), GetSpellModOwner(), HasAuraTypeWithCaster(), WorldObject::IsAlwaysDetectableFor(), SPELL_AURA_MOD_STALKED, and Object::ToPlayer().

Referenced by Creature::IsAlwaysDetectableFor(), and Player::IsAlwaysDetectableFor().

◆ IsAlwaysVisibleFor()

bool Unit::IsAlwaysVisibleFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

14182{
14184 return true;
14185
14186 // Always seen by owner
14187 if (ObjectGuid guid = GetCharmerOrOwnerGUID())
14188 if (seer->GetGUID() == guid)
14189 return true;
14190
14191 if (Player const* seerPlayer = seer->ToPlayer())
14192 if (Unit* owner = GetOwner())
14193 if (Player* ownerPlayer = owner->ToPlayer())
14194 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14195 return true;
14196
14197 return false;
14198}
virtual bool IsAlwaysVisibleFor(WorldObject const *) const
Definition: Object.h:663

References GetCharmerOrOwnerGUID(), Object::GetGUID(), GetOwner(), WorldObject::IsAlwaysVisibleFor(), and Object::ToPlayer().

◆ IsArmorer()

bool Unit::IsArmorer ( ) const
inline
@ UNIT_NPC_FLAG_REPAIR
Definition: UnitDefines.h:306
bool HasNpcFlag(NPCFlags flags) const
Definition: Unit.h:694

References HasNpcFlag(), and UNIT_NPC_FLAG_REPAIR.

◆ isAttackingPlayer()

bool Unit::isAttackingPlayer ( ) const
10454{
10456 return true;
10457
10458 if (!m_Controlled.empty())
10459 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10460 if ((*itr)->isAttackingPlayer())
10461 return true;
10462
10463 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
10464 if (m_SummonSlot[i])
10465 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
10466 if (summon->isAttackingPlayer())
10467 return true;
10468
10469 return false;
10470}

References WorldObject::GetMap(), HasUnitState(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, and UNIT_STATE_ATTACK_PLAYER.

◆ isAttackReady()

◆ IsAttackSpeedOverridenShapeShift()

bool Unit::IsAttackSpeedOverridenShapeShift ( ) const
19502{
19503 // Mirroring clientside gameplay logic
19504 if (ShapeshiftForm form = GetShapeshiftForm())
19505 if (SpellShapeshiftFormEntry const* entry = sSpellShapeshiftFormStore.LookupEntry(form))
19506 return entry->attackSpeed > 0;
19507
19508 return false;
19509}

References GetShapeshiftForm(), and sSpellShapeshiftFormStore.

Referenced by Player::CalculateMinMaxDamage().

◆ IsAuctioner()

bool Unit::IsAuctioner ( ) const
inline
@ UNIT_NPC_FLAG_AUCTIONEER
Definition: UnitDefines.h:315

References HasNpcFlag(), and UNIT_NPC_FLAG_AUCTIONEER.

◆ IsBanker()

bool Unit::IsBanker ( ) const
inline
@ UNIT_NPC_FLAG_BANKER
Definition: UnitDefines.h:311

References HasNpcFlag(), and UNIT_NPC_FLAG_BANKER.

◆ IsBattleMaster()

bool Unit::IsBattleMaster ( ) const
inline

◆ isBeingLoaded()

virtual bool Unit::isBeingLoaded ( ) const
inlinevirtual

Reimplemented in Pet, and Player.

1725{ return false;}

Referenced by Player::SetMover().

◆ isBlockCritical()

bool Unit::isBlockCritical ( )
3127{
3129 return true;
3130 return false;
3131}
@ SPELL_AURA_MOD_BLOCK_CRIT_CHANCE
Definition: SpellAuraDefines.h:316

References GetTotalAuraModifier(), roll_chance_i(), and SPELL_AURA_MOD_BLOCK_CRIT_CHANCE.

Referenced by CalculateMeleeDamage(), and CalculateSpellDamageTaken().

◆ IsCharmed()

◆ IsCharmedOwnedByPlayerOrPlayer()

bool Unit::IsCharmedOwnedByPlayerOrPlayer ( ) const
inline
ObjectGuid GetCharmerOrOwnerOrOwnGUID() const
Definition: Unit.h:1239

References GetCharmerOrOwnerOrOwnGUID(), and ObjectGuid::IsPlayer().

Referenced by Spell::DoSpellHitOnUnit(), and ProcDamageAndSpellFor().

◆ IsClass()

◆ IsContestedGuard()

bool Unit::IsContestedGuard ( ) const
inline
958 {
960 return entry->IsContestedGuardFaction();
961
962 return false;
963 }

References GetFactionTemplateEntry().

Referenced by Acore::NearestVisibleDetectableContestedGuardUnitCheck::operator()().

◆ IsControllableGuardian()

bool Unit::IsControllableGuardian ( ) const
inline

◆ IsControlledByPlayer()

◆ IsCreatedByPlayer()

bool Unit::IsCreatedByPlayer ( ) const
inline
1237{ return m_CreatedByPlayer; }

References m_CreatedByPlayer.

Referenced by DealDamage().

◆ IsCritter()

◆ IsDamageReducedByArmor()

bool Unit::IsDamageReducedByArmor ( SpellSchoolMask  damageSchoolMask,
SpellInfo const *  spellInfo = nullptr,
uint8  effIndex = MAX_SPELL_EFFECTS 
)
static
2009{
2010 // only physical spells damage gets reduced by armor
2011 if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0)
2012 return false;
2013 if (spellInfo)
2014 {
2015 // there are spells with no specific attribute but they have "ignores armor" in tooltip
2016 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_ARMOR))
2017 return false;
2018
2019 // bleeding effects are not reduced by armor
2020 if (effIndex != MAX_SPELL_EFFECTS)
2021 {
2022 if (spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
2023 spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
2024 if (spellInfo->GetEffectMechanicMask(effIndex) & (1 << MECHANIC_BLEED))
2025 return false;
2026 }
2027 }
2028 return true;
2029}
@ SPELL_ATTR0_CU_IGNORE_ARMOR
Definition: SpellInfo.h:191
@ MECHANIC_BLEED
Definition: SharedDefines.h:1340

References SpellInfo::Effects, SpellInfo::GetEffectMechanicMask(), SpellInfo::HasAttribute(), MAX_SPELL_EFFECTS, MECHANIC_BLEED, SPELL_ATTR0_CU_IGNORE_ARMOR, SPELL_AURA_PERIODIC_DAMAGE, SPELL_EFFECT_SCHOOL_DAMAGE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ isDead()

bool Unit::isDead ( ) const
inline
1218{ return (m_deathState == DeathState::Dead || m_deathState == DeathState::Corpse); };

References m_deathState.

Referenced by npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), Spell::EffectSummonPet(), AuraEffect::HandleAuraDummy(), Player::HandleFall(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), misc_commandscript::HandleRespawnCommand(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), Creature::HasSpellFocus(), UnitAI::InitializeAI(), SmartAI::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_spinestalker::npc_spinestalkerAI::InitializeAI(), npc_rimefang::npc_rimefangAI::InitializeAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::InitializeAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), Player::isAllowedToLoot(), npc_anubisath_sentinel::aqsentinelAI::JustDied(), Player::OnGossipSelect(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_scent_larkorwi::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), Player::PrepareGossipMenu(), SmartScript::ProcessAction(), Player::RepopAtGraveyard(), npc_anubisath_sentinel::aqsentinelAI::Reset(), WorldSession::SendAttackStop(), SendMeleeAttackStop(), instance_molten_core::instance_molten_core_InstanceMapScript::SetBossState(), and npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI().

◆ IsDuringRemoveFromWorld()

◆ isDying()

bool Unit::isDying ( ) const
inline
1217{ return (m_deathState == DeathState::JustDied); };

References m_deathState.

Referenced by Creature::IsInvisibleDueToDespawn(), and SetHover().

◆ IsEngaged()

◆ IsEngagedBy()

bool Unit::IsEngagedBy ( Unit const *  who) const
inline

◆ IsFalling()

bool Unit::IsFalling ( ) const

◆ isFeared()

◆ IsFFAPvP()

bool Unit::IsFFAPvP ( ) const
inline

◆ IsFlying()

◆ IsFriendlyTo()

bool Unit::IsFriendlyTo ( Unit const *  unit) const
10233{
10234 return GetReactionTo(unit) >= REP_FRIENDLY;
10235}

References GetReactionTo(), and REP_FRIENDLY.

Referenced by Spell::_cast(), AuraApplication::_InitFlags(), Creature::_IsTargetAcceptable(), FollowerAI::AssistPlayerInCombatAgainst(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), Creature::CanAssistTo(), spell_dk_death_coil::CheckCast(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), Spell::CheckCast(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), Spell::EffectDispel(), Spell::EffectDispelMechanic(), Spell::EffectStealBeneficialBuff(), Spell::EffectThreat(), Aura::HandleAuraSpecificMods(), spell_dk_death_coil::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pri_penance::HandleDummy(), HandleDummyAuraProc(), BattlefieldWG::HandleKill(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), WorldSession::HandleSetSelectionOpcode(), Spell::HandleThreatSpells(), GameObject::IsAlwaysVisibleFor(), SpellClickInfo::IsFitToRequirements(), npc_draenei_survivor::npc_draenei_survivorAI::MoveInLineOfSight(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), PetSpellFail(), SmartScript::ProcessEvent(), RemoveCharmedBy(), Spell::SelectExplicitTargets(), Player::SendLoot(), Acore::MessageDistDelivererToHostile::SendPacket(), and TotemAI::UpdateAI().

◆ isFrozen()

◆ IsFullHealth()

◆ IsGossip()

bool Unit::IsGossip ( ) const
inline
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:294

References HasNpcFlag(), and UNIT_NPC_FLAG_GOSSIP.

◆ IsGuardian()

◆ IsGuildMaster()

bool Unit::IsGuildMaster ( ) const
inline
@ UNIT_NPC_FLAG_PETITIONER
Definition: UnitDefines.h:312

References HasNpcFlag(), and UNIT_NPC_FLAG_PETITIONER.

◆ IsHostileTo()

◆ IsHostileToPlayers()

bool Unit::IsHostileToPlayers ( ) const
10238{
10239 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10240 if (!my_faction || !my_faction->faction)
10241 return false;
10242
10243 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10244 if (raw_faction && raw_faction->reputationListID >= 0)
10245 return false;
10246
10247 return my_faction->IsHostileToPlayers();
10248}
int32 reputationListID
Definition: DBCStructure.h:908
uint32 faction
Definition: DBCStructure.h:940
bool IsHostileToPlayers() const
Definition: DBCStructure.h:980

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsHostileToPlayers(), FactionEntry::reputationListID, and sFactionStore.

◆ IsHovering()

◆ IsHunterPet()

◆ IsImmunedToDamage() [1/3]

bool Unit::IsImmunedToDamage ( Spell const *  spell) const
12782{
12783 SpellInfo const* spellInfo = spell->GetSpellInfo();
12784 if (!spellInfo)
12785 {
12786 return false;
12787 }
12788
12790 {
12791 return false;
12792 }
12793
12795 {
12796 return false;
12797 }
12798
12799 uint32 schoolMask = spell->GetSpellSchoolMask();
12800 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12801 {
12802 return false;
12803 }
12804
12805 // If m_immuneToDamage type contain magic, IMMUNE damage.
12806 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12807 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12808 {
12809 if ((itr->type & schoolMask) == schoolMask)
12810 {
12811 return true;
12812 }
12813 }
12814
12815 return false;
12816}
std::vector< SpellImmune > SpellImmuneList
Definition: SpellDefines.h:179
@ SPELL_ATTR2_NO_SCHOOL_IMMUNITIES
Definition: SharedDefines.h:482
@ SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS
Definition: SharedDefines.h:435
@ IMMUNITY_DAMAGE
Definition: SharedDefines.h:1397
@ SPELL_SCHOOL_MASK_NONE
Definition: SharedDefines.h:296

References Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_AURA_SPIRIT_OF_REDEMPTION, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [2/3]

bool Unit::IsImmunedToDamage ( SpellInfo const *  spellInfo) const
12750{
12751 if (!spellInfo)
12752 {
12753 return false;
12754 }
12755
12757 {
12758 return false;
12759 }
12760
12761 if (spellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
12762 {
12763 return false;
12764 }
12765
12766 uint32 schoolMask = spellInfo->GetSchoolMask();
12767 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12768 {
12769 return false;
12770 }
12771
12772 // If m_immuneToDamage type contain magic, IMMUNE damage.
12773 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12774 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12775 if ((itr->type & schoolMask) == schoolMask)
12776 return true;
12777
12778 return false;
12779}

References SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_AURA_SPIRIT_OF_REDEMPTION, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [3/3]

bool Unit::IsImmunedToDamage ( SpellSchoolMask  meleeSchoolMask) const
12734{
12735 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12736 {
12737 return false;
12738 }
12739
12740 // If m_immuneToDamage type contain magic, IMMUNE damage.
12741 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12742 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12743 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12744 return true;
12745
12746 return false;
12747}

References IMMUNITY_DAMAGE, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by boss_gurtogg_bloodboil::CanAIAttack(), Spell::DoSpellHitOnUnit(), and IsImmunedToDamageOrSchool().

◆ IsImmunedToDamageOrSchool() [1/2]

bool Unit::IsImmunedToDamageOrSchool ( SpellInfo const *  spellInfo) const
12898{
12899 return IsImmunedToDamage(spellInfo) || IsImmunedToSchool(spellInfo);
12900}
bool IsImmunedToSchool(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12818
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12733

References IsImmunedToDamage(), and IsImmunedToSchool().

◆ IsImmunedToDamageOrSchool() [2/2]

◆ IsImmunedToSchool() [1/3]

bool Unit::IsImmunedToSchool ( Spell const *  spell) const
12858{
12859 SpellInfo const* spellInfo = spell->GetSpellInfo();
12861 {
12862 return false;
12863 }
12864
12865 uint32 schoolMask = spell->GetSpellSchoolMask();
12866 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12867 {
12868 return false;
12869 }
12870
12871 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12872 {
12873 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12874 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12875 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12876 {
12877 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12878 {
12879 return true;
12880 }
12881 }
12882 }
12883
12884 return false;
12885}
@ IMMUNITY_SCHOOL
Definition: SharedDefines.h:1396
bool CanPierceImmuneAura(SpellInfo const *aura) const
Definition: SpellInfo.cpp:1322

References SpellInfo::CanPierceImmuneAura(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_SPIRIT_OF_REDEMPTION, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [2/3]

bool Unit::IsImmunedToSchool ( SpellInfo const *  spellInfo) const
12835{
12837 return false;
12838
12839 uint32 schoolMask = spellInfo->GetSchoolMask();
12840 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12841 {
12842 return false;
12843 }
12844
12845 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12846 {
12847 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12848 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12849 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12850 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12851 return true;
12852 }
12853
12854 return false;
12855}

References SpellInfo::CanPierceImmuneAura(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_SPIRIT_OF_REDEMPTION, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [3/3]

bool Unit::IsImmunedToSchool ( SpellSchoolMask  meleeSchoolMask) const
12819{
12820 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12821 {
12822 return false;
12823 }
12824
12825 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12826 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12827 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12828 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12829 return true;
12830
12831 return false;
12832}

References IMMUNITY_SCHOOL, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by Spell::DoSpellHitOnUnit(), IsImmunedToDamageOrSchool(), and SpellHitResult().

◆ IsImmunedToSpell()

bool Unit::IsImmunedToSpell ( SpellInfo const *  spellInfo,
Spell const *  spell = nullptr 
)
virtual

Reimplemented in Creature.

12903{
12904 if (!spellInfo)
12905 return false;
12906
12907 // Single spell immunity.
12908 SpellImmuneList const& idList = m_spellImmune[IMMUNITY_ID];
12909 for (SpellImmuneList::const_iterator itr = idList.begin(); itr != idList.end(); ++itr)
12910 if (itr->type == spellInfo->Id)
12911 return true;
12912
12913 // xinef: my special immunity, if spellid is not on this list it means npc is immune
12914 SpellImmuneList const& allowIdList = m_spellImmune[IMMUNITY_ALLOW_ID];
12915 if (!allowIdList.empty())
12916 {
12917 for (SpellImmuneList::const_iterator itr = allowIdList.begin(); itr != allowIdList.end(); ++itr)
12918 if (itr->type == spellInfo->Id)
12919 return false;
12920 return true;
12921 }
12922
12924 return false;
12925
12926 if (spellInfo->Dispel)
12927 {
12928 SpellImmuneList const& dispelList = m_spellImmune[IMMUNITY_DISPEL];
12929 for (SpellImmuneList::const_iterator itr = dispelList.begin(); itr != dispelList.end(); ++itr)
12930 if (itr->type == spellInfo->Dispel)
12931 return true;
12932 }
12933
12934 // Spells that don't have effectMechanics.
12935 if (spellInfo->Mechanic)
12936 {
12937 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
12938 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
12939 if (itr->type == spellInfo->Mechanic)
12940 return true;
12941 }
12942
12943 bool immuneToAllEffects = true;
12944 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12945 {
12946 // State/effect immunities applied by aura expect full spell immunity
12947 // Ignore effects with mechanic, they are supposed to be checked separately
12948 if (!spellInfo->Effects[i].IsEffect())
12949 continue;
12950
12951 // Xinef: if target is immune to one effect, and the spell has transform aura - it is immune to whole spell
12952 if (IsImmunedToSpellEffect(spellInfo, i))
12953 {
12954 if (spellInfo->HasAura(SPELL_AURA_TRANSFORM))
12955 return true;
12956 continue;
12957 }
12958
12959 immuneToAllEffects = false;
12960 break;
12961 }
12962 if (immuneToAllEffects) //Return immune only if the target is immune to all spell effects.
12963 return true;
12964
12965 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12966 {
12967 SpellSchoolMask spellSchoolMask = spellInfo->GetSchoolMask();
12968 if (spell)
12969 {
12970 spellSchoolMask = spell->GetSpellSchoolMask();
12971 }
12972
12973 if (spellSchoolMask != SPELL_SCHOOL_MASK_NONE)
12974 {
12975 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12976 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12977 {
12978 SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId);
12979 if (((itr->type & spellSchoolMask) == spellSchoolMask)
12980 && (!immuneSpellInfo || immuneSpellInfo->IsPositive()) && !spellInfo->IsPositive()
12981 && !spellInfo->CanPierceImmuneAura(immuneSpellInfo))
12982 {
12983 return true;
12984 }
12985 }
12986 }
12987 }
12988
12989 return false;
12990}
@ IMMUNITY_ALLOW_ID
Definition: SharedDefines.h:1401
@ IMMUNITY_ID
Definition: SharedDefines.h:1400
@ IMMUNITY_MECHANIC
Definition: SharedDefines.h:1399

References SpellInfo::CanPierceImmuneAura(), SpellInfo::Dispel, SpellInfo::Effects, SpellInfo::GetSchoolMask(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasAuraType(), SpellInfo::Id, IMMUNITY_ALLOW_ID, IMMUNITY_DISPEL, IMMUNITY_ID, IMMUNITY_MECHANIC, IMMUNITY_SCHOOL, IsImmunedToSpellEffect(), SpellInfo::IsPositive(), m_spellImmune, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_SPIRIT_OF_REDEMPTION, SPELL_AURA_TRANSFORM, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

Referenced by AddAura(), Spell::DoSpellHitOnUnit(), Creature::IsImmunedToSpell(), spell_hun_lock_and_load::IsTargetValid(), boss_talon_king_ikiss::JustEngagedWith(), boss_kiggler_the_crazed::JustEngagedWith(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), and SpellHitResult().

◆ IsImmunedToSpellEffect()

bool Unit::IsImmunedToSpellEffect ( SpellInfo const *  spellInfo,
uint32  index 
) const
virtual

Reimplemented in Creature, and Totem.

12993{
12994 if (!spellInfo || !spellInfo->Effects[index].IsEffect())
12995 return false;
12996
12997 // xinef: pet scaling auras
12998 if (spellInfo->HasAttribute(SPELL_ATTR4_OWNER_POWER_SCALING))
12999 return false;
13000
13002 return false;
13003
13004 //If m_immuneToEffect type contain this effect type, IMMUNE effect.
13005 uint32 effect = spellInfo->Effects[index].Effect;
13006 SpellImmuneList const& effectList = m_spellImmune[IMMUNITY_EFFECT];
13007 for (SpellImmuneList::const_iterator itr = effectList.begin(); itr != effectList.end(); ++itr)
13008 {
13009 if (itr->type == effect && (itr->spellId != 62692 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13010 {
13011 return true;
13012 }
13013 }
13014
13015 if (uint32 mechanic = spellInfo->Effects[index].Mechanic)
13016 {
13017 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13018 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13019 if (itr->type == mechanic)
13020 return true;
13021 }
13022
13023 if (uint32 aura = spellInfo->Effects[index].ApplyAuraName)
13024 {
13026 for (SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
13027 {
13028 if (itr->type == aura && (itr->spellId != 64848 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13029 {
13030 if (!spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
13031 {
13032 if (itr->blockType == SPELL_BLOCK_TYPE_ALL || spellInfo->IsPositive()) // xinef: added for pet scaling
13033 {
13034 return true;
13035 }
13036 }
13037 }
13038 }
13039
13040 if (!spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
13041 {
13042 // Check for immune to application of harmful magical effects
13044 for (AuraEffectList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
13045 {
13046 if (/*(spellInfo->Dispel == DISPEL_MAGIC || spellInfo->Dispel == DISPEL_CURSE || spellInfo->Dispel == DISPEL_DISEASE) &&*/ // Magic debuff, xinef: all kinds?
13047 ((*iter)->GetMiscValue() & spellInfo->GetSchoolMask()) && // Check school
13048 !spellInfo->IsPositiveEffect(index) && // Harmful
13049 spellInfo->Effects[index].Effect != SPELL_EFFECT_PERSISTENT_AREA_AURA) // Not Persistent area auras
13050 {
13051 return true;
13052 }
13053 }
13054 }
13055 }
13056
13057 return false;
13058}
@ SPELL_BLOCK_TYPE_ALL
Definition: SpellDefines.h:156
@ SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL
Definition: SpellAuraDefines.h:330
@ SPELL_EFFECT_PERSISTENT_AREA_AURA
Definition: SharedDefines.h:805
@ SPELL_ATTR3_ALWAYS_HIT
Definition: SharedDefines.h:511
@ IMMUNITY_STATE
Definition: SharedDefines.h:1395
@ IMMUNITY_EFFECT
Definition: SharedDefines.h:1394
@ SPELL_ATTR4_OWNER_POWER_SCALING
Definition: SharedDefines.h:555
bool CanRestoreMana(SpellInfo const *spellInfo) const
Definition: Unit.cpp:21219

References CanRestoreMana(), SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), IMMUNITY_EFFECT, IMMUNITY_MECHANIC, IMMUNITY_STATE, SpellInfo::IsPositive(), SpellInfo::IsPositiveEffect(), m_spellImmune, POWER_MANA, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_OWNER_POWER_SCALING, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, SPELL_AURA_SPIRIT_OF_REDEMPTION, SPELL_BLOCK_TYPE_ALL, and SPELL_EFFECT_PERSISTENT_AREA_AURA.

Referenced by AddAura(), Spell::AddUnitTarget(), Spell::DoSpellHitOnUnit(), spell_dk_death_grip::HandleBaseDummy(), IsImmunedToSpell(), and Creature::IsImmunedToSpellEffect().

◆ IsImmuneToAll()

bool Unit::IsImmuneToAll ( ) const
inline
811{ return IsImmuneToPC() && IsImmuneToNPC(); }

References IsImmuneToNPC(), and IsImmuneToPC().

◆ IsImmuneToNPC()

◆ IsImmuneToPC()

◆ isInAccessiblePlaceFor()

bool Unit::isInAccessiblePlaceFor ( Creature const *  c) const
4194{
4195 if (c->GetMapId() == 618) // Ring of Valor
4196 {
4197 // skip transport check, check for being below floor level
4198 if (this->GetPositionZ() < 28.0f)
4199 return false;
4200 if (BattlegroundMap* bgMap = c->GetMap()->ToBattlegroundMap())
4201 if (Battleground* bg = bgMap->GetBG())
4202 if (bg->GetStartTime() < 80133) // 60000ms preparation time + 20133ms elevator rise time
4203 return false;
4204 }
4205 else if (c->GetMapId() == 631) // Icecrown Citadel
4206 {
4207 // if static transport doesn't match - return false
4208 if (c->GetTransport() != this->GetTransport() && ((c->GetTransport() && c->GetTransport()->IsStaticTransport()) || (this->GetTransport() && this->GetTransport()->IsStaticTransport())))
4209 return false;
4210
4211 // special handling for ICC (map 631), for non-flying pets in Gunship Battle, for trash npcs this is done via CanAIAttack
4212 if (c->GetOwnerGUID().IsPlayer() && !c->CanFly())
4213 {
4214 if (c->GetTransport() != this->GetTransport())
4215 return false;
4216 if (this->GetTransport())
4217 {
4218 if (c->GetPositionY() < 2033.0f)
4219 {
4220 if (this->GetPositionY() > 2033.0f)
4221 return false;
4222 }
4223 else if (c->GetPositionY() < 2438.0f)
4224 {
4225 if (this->GetPositionY() < 2033.0f || this->GetPositionY() > 2438.0f)
4226 return false;
4227 }
4228 else if (this->GetPositionY() < 2438.0f)
4229 return false;
4230 }
4231 }
4232 }
4233 else
4234 {
4235 // pussywizard: prevent any bugs by passengers exiting transports or normal creatures flying away
4236 if (c->GetTransport() != this->GetTransport())
4237 return false;
4238 }
4239
4240 LiquidStatus liquidStatus = GetLiquidData().Status;
4241 bool isInWater = (liquidStatus & MAP_LIQUID_STATUS_IN_CONTACT) != 0;
4242
4243 // In water or jumping in water
4244 if (isInWater || (liquidStatus == LIQUID_MAP_ABOVE_WATER && (IsFalling() || (ToPlayer() && ToPlayer()->IsFalling()))))
4245 {
4246 return c->CanEnterWater();
4247 }
4248 else
4249 {
4250 return c->CanWalk() || c->CanFly();
4251 }
4252}
LiquidStatus
Definition: Map.h:143
@ LIQUID_MAP_ABOVE_WATER
Definition: Map.h:145
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition: Map.h:152
LiquidData const & GetLiquidData() const
Definition: Object.cpp:3179
bool IsFalling() const
Definition: Unit.cpp:19939
LiquidStatus Status
Definition: Map.h:178
BattlegroundMap * ToBattlegroundMap()
Definition: Map.h:549
Definition: Map.h:853

References Creature::CanEnterWater(), Creature::CanFly(), Creature::CanWalk(), WorldObject::GetLiquidData(), WorldObject::GetMap(), WorldLocation::GetMapId(), GetOwnerGUID(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransport(), IsFalling(), ObjectGuid::IsPlayer(), GameObject::IsStaticTransport(), LIQUID_MAP_ABOVE_WATER, MAP_LIQUID_STATUS_IN_CONTACT, LiquidData::Status, Map::ToBattlegroundMap(), and Object::ToPlayer().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), ChaseMovementGenerator< T >::DoUpdate(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), and HostileReference::updateOnlineStatus().

◆ isInBackInMap()

bool Unit::isInBackInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const

◆ IsInCombat()

bool Unit::IsInCombat ( ) const
inline

References HasUnitFlag(), and UNIT_FLAG_IN_COMBAT.

Referenced by _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), npc_anubisath_sentinel::aqsentinelAI::CallBuddiesToAttack(), npc_argent_captainAI::CanAIAttack(), Player::CanEquipItem(), Creature::CanPeriodicallyCallForAssistance(), Player::CanUnequipItem(), boss_high_nethermancer_zerevor::CastDampenMagicIfPossible(), spell_hun_disengage::CheckCast(), Spell::CheckCast(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CombatStart(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::DoAction(), npc_risen_archmage::npc_risen_archmageAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoAllEffectOnTarget(), UnitAI::DoCastToAllHostilePlayers(), Spell::DoSpellHitOnUnit(), Spell::EffectActivateRune(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), Player::EquipItem(), CastRunesEvent::Execute(), GetVelocity(), spell_apothecary_lingering_fumes::HandleAfterCast(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::HandleBattleFieldPortOpcode(), spell_mc_play_dead_aura::HandleEffectRemove(), WorldSession::HandleEquipmentSetUse(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), spell_putricide_mutated_transformation::HandleSummon(), WorldSession::HandleSummonResponseOpcode(), tele_commandscript::HandleTeleCommand(), misc_commandscript::HandleUnstuckCommand(), WorldSession::HandleUseItemOpcode(), npc_pet_mage_mirror_image::InitializeAI(), IsEngaged(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_anubrekhan::boss_anubrekhanAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_rotface::boss_rotfaceAI::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), Pet::LoseHappiness(), CreatureGroup::MemberEvaded(), CreatureAI::MoveInLineOfSight(), boss_eye_of_cthun::MoveInLineOfSight(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_death_knight_initiate::OnGossipHello(), npc_ulduar_expedition_commander::OnGossipHello(), go_ulduar_working_harpoon::OnGossipHello(), npc_death_knight_initiate::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), at_frozen_throne_teleport::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_voltarus_middle::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), RisenArchmageCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::OwnerAttackedBy(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), SmartScript::ProcessEvent(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Player::RegenerateHealth(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), instance_naxxramas::instance_naxxramas_InstanceMapScript::SetBossState(), boss_grand_warlock_nethekurse::SetData(), SetInCombatState(), SetSpeed(), boss_prince_keleseth_icc::boss_prince_kelesethAI::SpellHit(), boss_prince_taldaram_icc::boss_prince_taldaramAI::SpellHit(), boss_prince_valanar_icc::boss_prince_valanarAI::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SpellHit(), Spell::SummonGuardian(), lfg::LFGMgr::TeleportPlayer(), Map::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Update(), DistractMovementGenerator::Update(), TotemAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_thekal::UpdateAI(), npc_zealot_lorkhan::UpdateAI(), npc_zealot_zath::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), boss_faction_championsAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_anubrekhan::boss_anubrekhanAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), PassiveAI::UpdateAI(), PetAI::UpdateAI(), Player::UpdateContestedPvP(), Creature::UpdateEntry(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), InstanceScript::UpdateMinionState(), SmartAI::UpdatePath(), Player::UpdatePotionCooldown(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsInCombatWith()

bool Unit::IsInCombatWith ( Unit const *  who) const
21026{
21027 // Check target exists
21028 if (!who)
21029 return false;
21030 // Search in threat list
21031 ObjectGuid guid = who->GetGUID();
21032 for (ThreatContainer::StorageType::const_iterator i = m_ThreatMgr.GetThreatList().begin(); i != m_ThreatMgr.GetThreatList().end(); ++i)
21033 {
21034 HostileReference* ref = (*i);
21035 // Return true if the unit matches
21036 if (ref && ref->getUnitGuid() == guid)
21037 return true;
21038 }
21039 // Nothing found, false.
21040 return false;
21041}
Definition: ThreatMgr.h:49
ObjectGuid getUnitGuid() const
Definition: ThreatMgr.h:107
ThreatContainer::StorageType const & GetThreatList() const
Definition: ThreatMgr.h:274

References Object::GetGUID(), ThreatMgr::GetThreatList(), HostileReference::getUnitGuid(), and m_ThreatMgr.

Referenced by _IsValidAttackTarget(), DealDamage(), Spell::DoAllEffectOnTarget(), TemporaryThreatModifierEvent::Execute(), spell_herald_volzaj_insanity::HandleDummyEffect(), IsEngagedBy(), and Acore::NearestAttackableUnitInObjectRangeCheck::operator()().

◆ IsInDisallowedMountForm()

bool Unit::IsInDisallowedMountForm ( ) const
21249{
21250 if (SpellInfo const* transformSpellInfo = sSpellMgr->GetSpellInfo(getTransForm()))
21251 {
21252 if (transformSpellInfo->HasAttribute(SPELL_ATTR0_ALLOW_WHILE_MOUNTED))
21253 {
21254 return false;
21255 }
21256 }
21257
21258 if (ShapeshiftForm form = GetShapeshiftForm())
21259 {
21260 SpellShapeshiftFormEntry const* shapeshift = sSpellShapeshiftFormStore.LookupEntry(form);
21261 if (!shapeshift)
21262 {
21263 return true;
21264 }
21265
21266 if (!(shapeshift->flags1 & 0x1))
21267 {
21268 return true;
21269 }
21270 }
21271
21273 {
21274 return false;
21275 }
21276
21277 CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(GetDisplayId());
21278 if (!display)
21279 {
21280 return true;
21281 }
21282
21284 if (!displayExtra)
21285 {
21286 return true;
21287 }
21288
21289 CreatureModelDataEntry const* model = sCreatureModelDataStore.LookupEntry(display->ModelId);
21290 ChrRacesEntry const* race = sChrRacesStore.LookupEntry(displayExtra->DisplayRaceID);
21291
21292 if (model && !(model->HasFlag(CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT)))
21293 {
21294 if (race && !(race->HasFlag(CHRRACES_FLAGS_CAN_MOUNT)))
21295 {
21296 return true;
21297 }
21298 }
21299
21300 return false;
21301}
@ SPELL_ATTR0_ALLOW_WHILE_MOUNTED
Definition: SharedDefines.h:406
@ CHRRACES_FLAGS_CAN_MOUNT
Definition: DBCStructure.h:674
@ CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT
Definition: DBCStructure.h:770
uint32 getTransForm() const
Definition: Unit.h:1527
bool HasFlag(ChrRacesFlags flag) const
Definition: DBCStructure.h:699
uint32 ExtendedDisplayInfoID
Definition: DBCStructure.h:724
uint32 DisplayRaceID
Definition: DBCStructure.h:740
bool HasFlag(CreatureModelDataFlags flag) const
Definition: DBCStructure.h:803
uint32 flags1
Definition: DBCStructure.h:1821

References CHRRACES_FLAGS_CAN_MOUNT, CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT, CreatureDisplayInfoExtraEntry::DisplayRaceID, CreatureDisplayInfoEntry::ExtendedDisplayInfoID, SpellShapeshiftFormEntry::flags1, GetDisplayId(), GetNativeDisplayId(), GetShapeshiftForm(), getTransForm(), ChrRacesEntry::HasFlag(), CreatureModelDataEntry::HasFlag(), CreatureDisplayInfoEntry::ModelId, sChrRacesStore, sCreatureDisplayInfoExtraStore, sCreatureDisplayInfoStore, sCreatureModelDataStore, SPELL_ATTR0_ALLOW_WHILE_MOUNTED, sSpellMgr, and sSpellShapeshiftFormStore.

Referenced by Player::ActivateTaxiPathTo(), Spell::CheckCast(), Player::ContinueTaxiFlight(), and Player::ProcessDelayedOperations().

◆ IsInFeralForm()

bool Unit::IsInFeralForm ( ) const
inline

◆ IsInFlight()

bool Unit::IsInFlight ( ) const
inline

◆ isInFrontInMap()

bool Unit::isInFrontInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const
4184{
4185 return IsWithinDistInMap(target, distance) && HasInArc(arc, target);
4186}

References Position::HasInArc(), and WorldObject::IsWithinDistInMap().

◆ IsInnkeeper()

bool Unit::IsInnkeeper ( ) const
inline
@ UNIT_NPC_FLAG_INNKEEPER
Definition: UnitDefines.h:310

References HasNpcFlag(), and UNIT_NPC_FLAG_INNKEEPER.

Referenced by npc_innkeeper::OnGossipHello().

◆ IsInPartyWith()

bool Unit::IsInPartyWith ( Unit const *  unit) const
18762{
18763 if (this == unit)
18764 return true;
18765
18766 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18767 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18768 if (u1 == u2)
18769 return true;
18770
18771 if (u1->IsPlayer() && u2->IsPlayer())
18772 return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer());
18773 // Xinef: we assume that npcs with the same faction are in party
18774 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18775 return u1->GetFaction() == u2->GetFaction();
18776 // Xinef: creature type_flag should work for party check only if player group is not a raid
18779 return true;
18780 else
18781 return false;
18782}
bool IsInSameGroupWith(Player const *p) const
Definition: Player.cpp:2308
bool isRaidGroup() const
Definition: Group.cpp:2271

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), Player::GetGroup(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameGroupWith(), Object::IsPlayer(), Group::isRaidGroup(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by SpellInfo::CheckExplicitTarget(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ IsInRaidWith()

bool Unit::IsInRaidWith ( Unit const *  unit) const
18785{
18786 if (this == unit)
18787 return true;
18788
18789 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18790 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18791 if (u1 == u2)
18792 return true;
18793
18794 if (u1->IsPlayer() && u2->IsPlayer())
18795 return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer());
18796 // Xinef: we assume that npcs with the same faction are in party
18797 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18798 return u1->GetFaction() == u2->GetFaction();
18801 return true;
18802 else
18803 return false;
18804}

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameRaidWith(), Object::IsPlayer(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by Corpse::BuildValuesUpdate(), SpellInfo::CheckExplicitTarget(), GetReactionTo(), WorldSession::HandleLootMasterGiveOpcode(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), and PatchValuesUpdate().

◆ isInRoots()

bool Unit::isInRoots ( ) const
inline

◆ IsInSanctuary()

bool Unit::IsInSanctuary ( ) const
inline

◆ IsInWater()

bool Unit::IsInWater ( ) const
virtual

◆ IsLevitating()

◆ IsMounted()

◆ IsMovementPreventedByCasting()

bool Unit::IsMovementPreventedByCasting ( ) const
virtual

Reimplemented in Creature.

4160{
4161 // can always move when not casting
4163 {
4164 return false;
4165 }
4166
4167 // channeled spells during channel stage (after the initial cast timer) allow movement with a specific spell attribute
4169 {
4170 if (spell->getState() != SPELL_STATE_FINISHED && spell->IsChannelActive())
4171 {
4172 if (spell->GetSpellInfo()->IsActionAllowedChannel())
4173 {
4174 return false;
4175 }
4176 }
4177 }
4178
4179 // prohibit movement for all other spell casts
4180 return true;
4181}
@ UNIT_STATE_CASTING
Definition: UnitDefines.h:164

References CURRENT_CHANNELED_SPELL, HasUnitState(), m_currentSpells, SPELL_STATE_FINISHED, and UNIT_STATE_CASTING.

Referenced by TimedFleeingMovementGenerator::Update().

◆ isMoving()

◆ IsNeutralToAll()

bool Unit::IsNeutralToAll ( ) const
10251{
10252 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10253 if (!my_faction || !my_faction->faction)
10254 return true;
10255
10256 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10257 if (raw_faction && raw_faction->reputationListID >= 0)
10258 return false;
10259
10260 return my_faction->IsNeutralToAll();
10261}
bool IsNeutralToAll() const
Definition: DBCStructure.h:981

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsNeutralToAll(), FactionEntry::reputationListID, and sFactionStore.

Referenced by Creature::_IsTargetAcceptable(), Creature::CanStartAttack(), AggressorAI::Permissible(), and ReactorAI::Permissible().

◆ IsNonMeleeSpellCast()

bool Unit::IsNonMeleeSpellCast ( bool  withDelayed,
bool  skipChanneled = false,
bool  skipAutorepeat = false,
bool  isAutoshoot = false,
bool  skipInstant = true 
) const
4100{
4101 // We don't do loop here to explicitly show that melee spell is excluded.
4102 // Maybe later some special spells will be excluded too.
4103
4104 // generic spells are cast when they are not finished and not delayed
4107 (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED))
4108 {
4109 if (!skipInstant || m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime())
4110 {
4111 if (!isAutoshoot || !m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4112 return true;
4113 }
4114 }
4115 // channeled spells may be delayed, but they are still considered cast
4116 if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] &&
4118 {
4119 if (!isAutoshoot || !m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4120 return true;
4121 }
4122 // autorepeat spells may be finished or delayed, but they are still considered cast
4123 if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL])
4124 return true;
4125
4126 return false;
4127}
@ SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS
Definition: SharedDefines.h:473

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, m_currentSpells, SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_DELAYED, and SPELL_STATE_FINISHED.

Referenced by Spell::_cast(), _UpdateAutoRepeatSpell(), Player::ActivateSpec(), Player::ActivateTaxiPathTo(), Player::CanEquipItem(), CombatStop(), npc_mograine::npc_mograineAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), ScriptedAI::DoCastSpell(), boss_zuljin::boss_zuljinAI::DoMeleeAttackIfReady(), Spell::EffectKnockBack(), Spell::finish(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), isSpellBlocked(), boss_shade_of_aran::JustEngagedWith(), boss_pandemonius::JustEngagedWith(), MeleeSpellHitResult(), Spell::prepare(), SmartScript::ProcessEvent(), RollMeleeOutcomeAgainst(), spell_item_fetch_ball::SelectTarget(), setDeathState(), StopAttackFaction(), boss_netherspite::SwitchToPortalPhase(), Player::TeleportTo(), TotemAI::UpdateAI(), npc_chesspiece::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_warmage_violetstand::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ IsOnVehicle()

◆ IsPet()

bool Unit::IsPet ( ) const
inline
710{ return m_unitTypeMask & UNIT_MASK_PET; }
@ UNIT_MASK_PET
Definition: UnitDefines.h:139

References m_unitTypeMask, and UNIT_MASK_PET.

Referenced by Spell::_cast(), Spell::AddUnitTarget(), spell_warl_demonic_pact_aura::AfterCheckProc(), Creature::AllLootRemovedFromCorpse(), BeforeVisibilityDestroy< Creature >(), Creature::CallAssistance(), Creature::CallForHelp(), boss_renataki::boss_renatakiAI::CanAlwaysBeDetectable(), boss_renataki::boss_renatakiAI::CanSeeAlways(), Creature::CanSwim(), ClearInCombat(), CombatStart(), Creature::CreateFromProto(), Player::CreatePet(), DealDamage(), MotionTransport::DelayedTeleportTransport(), PetAI::DoAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectDismissPet(), Spell::EffectForceDeselect(), Spell::EffectRenamePet(), Spell::EffectSanctuary(), Spell::EffectSchoolDMG(), Spell::EffectTameCreature(), Acore::XP::Gain(), Creature::GetAggroRange(), GetCastingTimeForBonus(), GetCombatRatingReduction(), GetCreatePowers(), GetNextRandomRaidMemberOrPet(), GetRandomContactPoint(), GetVelocity(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModStat(), debug_commandscript::HandleDebugThreatListCommand(), AuraEffect::HandleFeignDeath(), modify_commandscript::HandleModifyTalentCommand(), AuraEffect::HandleModPossessPet(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcDeleteCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_commandscript::HandleNpcSetModelCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), npc_commandscript::HandleNpcTameCommand(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), pet_commandscript::HandlePetCreateCommand(), WorldSession::HandlePetRename(), WorldSession::HandlePetSetAction(), misc_commandscript::HandleRespawnCommand(), Creature::InitEntry(), TempSummon::InitStats(), Guardian::InitStatsForLevel(), DisableMgr::IsDisabledFor(), Creature::isElite(), Minion::IsGuardianPet(), Player::isHonorOrXPTarget(), Creature::isWorldBoss(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_underbat::JustEngagedWith(), npc_hivezara_stinger::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_murmur::JustEngagedWith(), Kill(), spell_hun_target_self_and_pet::Load(), ModSpellCastTime(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::MoveInLineOfSight(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::MoveInLineOfSight(), Acore::MostHPMissingGroupInRange::operator()(), PetAI::ReceiveEmote(), RollMeleeOutcomeAgainst(), FactorySelector::SelectAI(), Creature::SelectLevel(), WorldSession::SendPetNameQuery(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetCharm(), Creature::SetDisplayId(), SetHealth(), SetInCombatState(), SetMinion(), Creature::SetObjectScale(), setPowerType(), SpellDamageBonusDone(), SpellPctDamageModsDone(), ToPet(), TempSummon::UnSummon(), Update(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_hazzarah::UpdateAI(), PetAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdateAuraForGroup(), Creature::UpdateEntry(), Creature::UpdateMoveInLineOfSightState(), and UpdateSpeed().

◆ IsPetAura()

bool Unit::IsPetAura ( Aura const *  aura)
17324{
17325 Unit* owner = GetOwner();
17326
17327 if (!owner || !owner->IsPlayer())
17328 return false;
17329
17330 // if the owner has that pet aura, return true
17331 for (PetAura const* petAura : owner->m_petAuras)
17332 if (petAura->GetAura(GetEntry()) == aura->GetId())
17333 return true;
17334
17335 return false;
17336}
Definition: SpellMgr.h:470
uint32 GetAura(uint32 petEntry) const
Definition: SpellMgr.h:486

References PetAura::GetAura(), Object::GetEntry(), Aura::GetId(), GetOwner(), Object::IsPlayer(), and m_petAuras.

Referenced by Pet::_SaveAuras(), and Spell::EffectSummonPet().

◆ IsPetInCombat()

bool Unit::IsPetInCombat ( ) const
inline

◆ IsPolymorphed()

bool Unit::IsPolymorphed ( ) const
16729{
16730 uint32 transformId = getTransForm();
16731 if (!transformId)
16732 return false;
16733
16734 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(transformId);
16735 if (!spellInfo)
16736 return false;
16737
16738 return spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_MAGE_POLYMORPH;
16739}
@ SPELL_SPECIFIC_MAGE_POLYMORPH
Definition: SpellInfo.h:160
SpellSpecificType GetSpellSpecific() const
Definition: SpellInfo.cpp:2136

References SpellInfo::GetSpellSpecific(), getTransForm(), SPELL_SPECIFIC_MAGE_POLYMORPH, and sSpellMgr.

Referenced by Attack(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), and Creature::Update().

◆ isPossessed()

◆ isPossessedByPlayer()

bool Unit::isPossessedByPlayer ( ) const
inline

◆ isPossessing() [1/2]

bool Unit::isPossessing ( ) const
inline
1282 {
1283 if (Unit* u = GetCharm())
1284 return u->isPossessed();
1285 else
1286 return false;
1287 }

References GetCharm().

Referenced by WorldSession::HandleCastSpellOpcode(), and misc_commandscript::HandleUnbindSightCommand().

◆ isPossessing() [2/2]

bool Unit::isPossessing ( Unit u) const
inline
1288{ return u->isPossessed() && GetCharmGUID() == u->GetGUID(); }
bool isPossessed() const
Definition: Unit.h:1279

References GetCharmGUID(), Object::GetGUID(), and isPossessed().

◆ IsPvP()

◆ IsQuestGiver()

bool Unit::IsQuestGiver ( ) const
inline
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: UnitDefines.h:295

References HasNpcFlag(), and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_lokhtos_darkbargainer::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_cos_chromie_middle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_queue::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_taxi::OnGossipHello(), npc_riggle_bassbait::OnGossipHello(), and npc_sayge::OnGossipHello().

◆ IsScriptOverriden()

AuraEffect * Unit::IsScriptOverriden ( SpellInfo const *  spell,
int32  script 
) const
5810{
5812 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5813 {
5814 if ((*i)->GetMiscValue() == script)
5815 if ((*i)->IsAffectedOnSpell(spell))
5816 return (*i);
5817 }
5818 return nullptr;
5819}
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition: SpellAuraDefines.h:175

References GetAuraEffectsByType(), and SPELL_AURA_OVERRIDE_CLASS_SCRIPTS.

Referenced by Spell::CheckCast(), Spell::EffectWeaponDmg(), and AuraEffect::HandleAuraModShapeshift().

◆ IsServiceProvider()

bool Unit::IsServiceProvider ( ) const
inline

◆ IsSitState()

bool Unit::IsSitState ( ) const
16699{
16700 uint8 s = getStandState();
16701 return
16705}
@ UNIT_STAND_STATE_SIT_HIGH_CHAIR
Definition: UnitDefines.h:38
@ UNIT_STAND_STATE_SIT_MEDIUM_CHAIR
Definition: UnitDefines.h:37
@ UNIT_STAND_STATE_SIT_LOW_CHAIR
Definition: UnitDefines.h:36
@ UNIT_STAND_STATE_SIT_CHAIR
Definition: UnitDefines.h:34

References getStandState(), UNIT_STAND_STATE_SIT, UNIT_STAND_STATE_SIT_CHAIR, UNIT_STAND_STATE_SIT_HIGH_CHAIR, UNIT_STAND_STATE_SIT_LOW_CHAIR, and UNIT_STAND_STATE_SIT_MEDIUM_CHAIR.

Referenced by _ApplyAura(), AttackerStateUpdate(), WorldSession::HandleMovementOpcodes(), IsStandState(), Spell::prepare(), and SpellTakenCritChance().

◆ isSpellBlocked()

bool Unit::isSpellBlocked ( Unit victim,
SpellInfo const *  spellProto,
WeaponAttackType  attackType = BASE_ATTACK 
)
3101{
3102 // These spells can't be blocked
3103 if (spellProto && spellProto->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3104 return false;
3105
3106 if (victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION) || victim->HasInArc(M_PI, this))
3107 {
3108 // Check creatures flags_extra for disable block
3109 if (victim->IsCreature() &&
3111 return false;
3112
3113 float blockChance = victim->GetUnitBlockChance();
3114 blockChance += (int32(GetWeaponSkillValue(attackType)) - int32(victim->GetMaxSkillValueForLevel())) * 0.04f;
3115
3116 // xinef: cant block while casting or while stunned
3117 if (blockChance < 0.0f || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3118 blockChance = 0.0f;
3119
3120 if (roll_chance_f(blockChance))
3121 return true;
3122 }
3123 return false;
3124}
@ SPELL_AURA_IGNORE_HIT_DIRECTION
Definition: SpellAuraDefines.h:351
@ CREATURE_FLAG_EXTRA_NO_BLOCK
Definition: CreatureData.h:50
@ UNIT_STATE_CONTROLLED
Definition: UnitDefines.h:190
@ SPELL_ATTR0_NO_ACTIVE_DEFENSE
Definition: SharedDefines.h:403
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition: Unit.cpp:3790
float GetUnitBlockChance() const
Definition: Unit.cpp:3702

References CREATURE_FLAG_EXTRA_NO_BLOCK, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), HasAuraType(), Position::HasInArc(), HasUnitState(), Object::IsCreature(), IsNonMeleeSpellCast(), roll_chance_f(), SPELL_ATTR0_NO_ACTIVE_DEFENSE, SPELL_AURA_IGNORE_HIT_DIRECTION, Object::ToCreature(), and UNIT_STATE_CONTROLLED.

Referenced by CalculateSpellDamageTaken().

◆ IsSpiritGuide()

bool Unit::IsSpiritGuide ( ) const
inline

◆ IsSpiritHealer()

bool Unit::IsSpiritHealer ( ) const
inline

◆ IsSpiritService()

◆ IsStandState()

◆ IsStopped()

bool Unit::IsStopped ( ) const
inline

◆ IsSummon()

bool Unit::IsSummon ( ) const
inline
@ UNIT_MASK_SUMMON
Definition: UnitDefines.h:135

References m_unitTypeMask, and UNIT_MASK_SUMMON.

Referenced by Creature::CanPeriodicallyCallForAssistance(), spell_item_unsated_craving::CheckProc(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Spell::EffectScriptEffect(), boss_skeram::EnterEvadeMode(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), Spell::finish(), GetAllMinionsByEntry(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pri_lightwell::HandleScriptEffect(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), boss_skeram::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::npc_pet_dk_ghoulAI::JustDied(), npc_pet_pri_shadowfiend::JustDied(), boss_skeram::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), BattlefieldWG::OnCreatureCreate(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnCreatureCreate(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnUnitDeath(), RemoveAllControlled(), RemoveAllMinionsByEntry(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), Creature::SaveRespawnTime(), Creature::SearchFormation(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), ToTempSummon(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_skeram::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), and Player::VehicleSpellInitialize().

◆ isSwimming()

◆ IsTabardDesigner()

bool Unit::IsTabardDesigner ( ) const
inline

◆ isTargetableForAttack()

bool Unit::isTargetableForAttack ( bool  checkFakeDeath = true,
Unit const *  byWho = nullptr 
) const

◆ IsTaxi()

bool Unit::IsTaxi ( ) const
inline

◆ IsTotem()

◆ IsTrainer()

◆ IsTriggeredAtSpellProcEvent()

bool Unit::IsTriggeredAtSpellProcEvent ( Unit victim,
Aura aura,
WeaponAttackType  attType,
bool  isVictim,
bool  active,
SpellProcEventEntry const *&  spellProcEvent,
ProcEventInfo const &  eventInfo 
)
private
17411{
17412 SpellInfo const* spellProto = aura->GetSpellInfo();
17413 SpellInfo const* procSpell = eventInfo.GetSpellInfo();
17414
17415 // let the aura be handled by new proc system if it has new entry
17416 if (sSpellMgr->GetSpellProcEntry(spellProto->Id))
17417 return false;
17418
17419 // Get proc Event Entry
17420 spellProcEvent = sSpellMgr->GetSpellProcEvent(spellProto->Id);
17421
17422 // Get EventProcFlag
17423 uint32 EventProcFlag;
17424 if (spellProcEvent && spellProcEvent->procFlags) // if exist get custom spellProcEvent->procFlags
17425 EventProcFlag = spellProcEvent->procFlags;
17426 else
17427 EventProcFlag = spellProto->ProcFlags; // else get from spell proto
17428 // Continue if no trigger exist
17429 if (!EventProcFlag)
17430 return false;
17431
17432 // Additional checks for triggered spells (ignore trap casts)
17433 //if (procExtra & PROC_EX_INTERNAL_TRIGGERED && !(procFlag & PROC_FLAG_DONE_TRAP_ACTIVATION))
17434 //{
17435 // if (!spellProto->HasAttribute(SPELL_ATTR3_CAN_PROC_TRIGGERED))
17436 // return false;
17437 //}
17438
17439 // Xinef: additional check for player auras - only player spells can trigger player proc auras
17440 // Xinef: skip victim auras
17441 // Excluded player shoot spells
17442 // Excluded player item spells
17443 if (!isVictim && IsPlayer() && !(EventProcFlag & (PROC_FLAG_KILL | PROC_FLAG_DEATH)))
17444 {
17445 if (procSpell && procSpell->SpellFamilyName == SPELLFAMILY_GENERIC && procSpell->GetCategory() != 76 &&
17446 (!eventInfo.GetProcSpell() || !eventInfo.GetProcSpell()->m_CastItem) &&
17447 (!eventInfo.GetTriggerAuraSpell() || eventInfo.GetTriggerAuraSpell()->SpellFamilyName == SPELLFAMILY_GENERIC))
17448 {
17449 return false;
17450 }
17451 }
17452
17453 // Check spellProcEvent data requirements
17454 if (!sSpellMgr->IsSpellProcEventCanTriggeredBy(spellProto, spellProcEvent, EventProcFlag, eventInfo, active))
17455 return false;
17456 // In most cases req get honor or XP from kill
17457 if (EventProcFlag & PROC_FLAG_KILL && IsPlayer())
17458 {
17459 bool allow = false;
17460
17461 if (victim)
17462 allow = ToPlayer()->isHonorOrXPTarget(victim);
17463
17464 // Shadow Word: Death - can trigger from every kill
17465 if (aura->GetId() == 32409 || aura->GetId() == 18372 || aura->GetId() == 18213)
17466 allow = true;
17467 if (!allow)
17468 return false;
17469 }
17470 // Aura added by spell can`t trigger from self (prevent drop charges/do triggers)
17471 // But except periodic and kill triggers (can triggered from self)
17472 if (procSpell && procSpell->Id == spellProto->Id
17473 && !(spellProto->ProcFlags & (PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_KILL)))
17474 return false;
17475
17476 // Check if current equipment allows aura to proc
17477 if (!isVictim && IsPlayer() && !spellProto->HasAttribute(SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT))
17478 {
17479 Player* player = ToPlayer();
17480 if (spellProto->EquippedItemClass == ITEM_CLASS_WEAPON)
17481 {
17482 Item* item = nullptr;
17483 if (attType == BASE_ATTACK)
17485 else if (attType == OFF_ATTACK)
17487 else
17489
17490 if (player->IsInFeralForm())
17491 return false;
17492
17493 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_WEAPON || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17494 return false;
17495 }
17496 else if (spellProto->EquippedItemClass == ITEM_CLASS_ARMOR)
17497 {
17498 // Check if player is wearing shield
17500 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_ARMOR || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17501 return false;
17502 }
17503 }
17504 // Get chance from spell
17505 float chance = float(spellProto->ProcChance);
17506 // If in spellProcEvent exist custom chance, chance = spellProcEvent->customChance;
17507 if (spellProcEvent && spellProcEvent->customChance)
17508 chance = spellProcEvent->customChance;
17509 // If PPM exist calculate chance from PPM
17510 if (spellProcEvent && spellProcEvent->ppmRate != 0)
17511 {
17512 if (!isVictim)
17513 {
17514 uint32 WeaponSpeed = GetAttackTime(attType);
17515 chance = GetPPMProcChance(WeaponSpeed, spellProcEvent->ppmRate, spellProto);
17516 }
17517 else if (victim)
17518 {
17519 uint32 WeaponSpeed = victim->GetAttackTime(attType);
17520 chance = victim->GetPPMProcChance(WeaponSpeed, spellProcEvent->ppmRate, spellProto);
17521 }
17522 }
17523
17524 // Custom chances
17525 switch (spellProto->SpellFamilyName)
17526 {
17528 {
17529 // Recklessness, allow to proc only once for whirlwind
17530 if (spellProto->Id == 1719 && procSpell && procSpell->Id == 44949)
17531 return false;
17532 }
17533 }
17534
17535 if (eventInfo.GetProcChance())
17536 {
17537 chance = *eventInfo.GetProcChance();
17538 }
17539
17540 // Apply chance modifer aura
17541 if (Player* modOwner = GetSpellModOwner())
17542 {
17543 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CHANCE_OF_SUCCESS, chance);
17544 }
17545
17546 return roll_chance_f(chance);
17547}
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition: SpellDefines.h:94
@ PROC_FLAG_DEATH
Definition: SpellMgr.h:143
@ PROC_FLAG_TAKEN_PERIODIC
Definition: SpellMgr.h:135
@ PROC_FLAG_KILL
Definition: SpellMgr.h:108
@ EQUIPMENT_SLOT_RANGED
Definition: Player.h:692
@ ITEM_CLASS_ARMOR
Definition: ItemTemplate.h:295
@ ITEM_CLASS_WEAPON
Definition: ItemTemplate.h:293
@ SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT
Definition: SharedDefines.h:494
uint32 Class
Definition: ItemTemplate.h:621
uint32 SubClass
Definition: ItemTemplate.h:622
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition: Player.h:1244
bool isHonorOrXPTarget(Unit *victim) const
Definition: Player.cpp:12668
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition: Unit.cpp:13437
uint32 GetCategory() const
Definition: SpellInfo.cpp:870
int32 EquippedItemClass
Definition: SpellInfo.h:375
uint32 ProcFlags
Definition: SpellInfo.h:355
int32 EquippedItemSubClassMask
Definition: SpellInfo.h:376

References BASE_ATTACK, ItemTemplate::Class, SpellProcEventEntry::customChance, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, SpellInfo::EquippedItemClass, SpellInfo::EquippedItemSubClassMask, GetAttackTime(), SpellInfo::GetCategory(), Aura::GetId(), GetPPMProcChance(), ProcEventInfo::GetProcChance(), ProcEventInfo::GetProcSpell(), ProcEventInfo::GetSpellInfo(), Aura::GetSpellInfo(), GetSpellModOwner(), Item::GetTemplate(), ProcEventInfo::GetTriggerAuraSpell(), Player::GetUseableItemByPos(), SpellInfo::HasAttribute(), SpellInfo::Id, INVENTORY_SLOT_BAG_0, Item::IsBroken(), Player::isHonorOrXPTarget(), IsInFeralForm(), Object::IsPlayer(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, Spell::m_CastItem, OFF_ATTACK, SpellProcEventEntry::ppmRate, PROC_FLAG_DEATH, PROC_FLAG_KILL, PROC_FLAG_TAKEN_PERIODIC, SpellInfo::ProcChance, SpellInfo::ProcFlags, SpellProcEventEntry::procFlags, roll_chance_f(), SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT, SPELLFAMILY_GENERIC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyName, SPELLMOD_CHANCE_OF_SUCCESS, sSpellMgr, ItemTemplate::SubClass, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ isTurning()

bool Unit::isTurning ( ) const
inline

◆ IsUnderLastManaUseEffect()

bool Unit::IsUnderLastManaUseEffect ( ) const

◆ IsUnderWater()

bool Unit::IsUnderWater ( ) const
virtual
4345{
4347}
@ LIQUID_MAP_UNDER_WATER
Definition: Map.h:148

References WorldObject::GetLiquidData(), LIQUID_MAP_UNDER_WATER, and LiquidData::Status.

Referenced by Creature::setDeathState().

◆ IsValidAssistTarget()

bool Unit::IsValidAssistTarget ( Unit const *  target) const
13981{
13982 return _IsValidAssistTarget(target, nullptr);
13983}
bool _IsValidAssistTarget(Unit const *target, SpellInfo const *bySpell) const
Definition: Unit.cpp:13986

References _IsValidAssistTarget().

Referenced by SmartAI::AssistPlayerInCombatAgainst().

◆ IsValidAttackTarget()

bool Unit::IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell = nullptr 
) const
13858{
13859 return _IsValidAttackTarget(target, bySpell);
13860}

References _IsValidAttackTarget().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), CreatureGroup::GetNewTargetForMember(), WorldSession::HandleAttackSwingOpcode(), npc_beryl_sorcerer::npc_beryl_sorcererAI::JustEngagedWith(), CreatureGroup::MemberEngagingTarget(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestHostileUnitCheck::operator()(), MalleableGooSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), CreatureAI::SetGazeOn(), StopAttackingInvalidTarget(), SimpleCharmedAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateCharmedAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ IsVehicle()

◆ IsVendor()

◆ IsVisible()

bool Unit::IsVisible ( ) const
inline
@ SEC_PLAYER
Definition: Common.h:57
@ SERVERSIDE_VISIBILITY_GM
Definition: SharedDefines.h:1273
T_VALUES GetValue(FLAG_TYPE flag) const
Definition: Object.h:371

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::GetValue(), WorldObject::m_serverSideVisibility, SEC_PLAYER, and SERVERSIDE_VISIBILITY_GM.

Referenced by npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::CanAIAttack(), boss_professor_putricide::boss_professor_putricideAI::CanAIAttack(), boss_sindragosa::boss_sindragosaAI::CanAIAttack(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), SpellInfo::CheckTarget(), AuraEffect::HandlePhase(), Player::IsVisibleGloballyFor(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), Acore::AllFriendlyCreaturesInGrid::operator()(), boss_sapphiron::boss_sapphironAI::Reset(), npc_pos_leader::npc_pos_leaderAI::SetData(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), boss_taldaram::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), and boss_vazruden_the_herald::UpdateAI().

◆ IsWalking()

◆ IsWithinCombatRange()

bool Unit::IsWithinCombatRange ( Unit const *  obj,
float  dist2compare 
) const

◆ IsWithinMeleeRange()

bool Unit::IsWithinMeleeRange ( Unit const *  obj,
float  dist = 0.f 
) const
665{
666 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
667 return false;
668
669 float dx = GetPositionX() - obj->GetPositionX();
670 float dy = GetPositionY() - obj->GetPositionY();
671 float dz = GetPositionZ() - obj->GetPositionZ();
672 float distsq = dx * dx + dy * dy + dz * dz;
673
674 float maxdist = dist + GetMeleeRange(obj);
675
676 return distsq < maxdist * maxdist;
677}

References GetMeleeRange(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by boss_marli::_chargePlayer(), boss_swamplord_muselek::AttackStart(), SmartAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::CanAIAttack(), boss_ouro::CanAIAttack(), boss_murmur::CanAIAttack(), boss_alar::CanAIAttack(), PetAI::CanAttack(), Spell::CheckRange(), UnitAI::DoMeleeAttackIfReady(), boss_zuljin::boss_zuljinAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), spell_shazzrah_gate_dummy::FilterTargets(), boss_supremus::FindHatefulStrikeTarget(), boss_ouro::IsPlayerWithinMeleeRange(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), boss_swamplord_muselek::JustEngagedWith(), boss_vem::JustEngagedWith(), CreatureAI::MoveCircleChecks(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), SpellTargetSelector::operator()(), ThreatContainer::SelectNextVictim(), boss_murmur::ShouldCastResonance(), boss_quartermaster_zigris::SpellHitTarget(), Player::Update(), boss_quartermaster_zigris::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_zuljin::boss_zuljinAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_skeram::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), PetAI::UpdateAI(), npc_zuljin_vortex::npc_zuljin_vortexAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), and boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI().

◆ IsWithinRange()

bool Unit::IsWithinRange ( Unit const *  obj,
float  dist 
) const
686{
687 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
688 {
689 return false;
690 }
691
692 auto dx = GetPositionX() - obj->GetPositionX();
693 auto dy = GetPositionY() - obj->GetPositionY();
694 auto dz = GetPositionZ() - obj->GetPositionZ();
695 auto distsq = dx * dx + dy * dy + dz * dz;
696
697 return distsq <= dist * dist;
698}

References Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by boss_swamplord_muselek::CanShootVictim().

◆ JumpTo() [1/2]

void Unit::JumpTo ( float  speedXY,
float  speedZ,
bool  forward = true 
)
19512{
19513 float angle = forward ? 0 : M_PI;
19514 if (IsCreature())
19515 GetMotionMaster()->MoveJumpTo(angle, speedXY, speedZ);
19516 else
19517 {
19518 float vcos = cos(angle + GetOrientation());
19519 float vsin = std::sin(angle + GetOrientation());
19520
19521 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19522 data << GetPackGUID();
19523 data << uint32(0); // Sequence
19524 data << float(vcos); // x direction
19525 data << float(vsin); // y direction
19526 data << float(speedXY); // Horizontal speed
19527 data << float(-speedZ); // Z Movement speed (vertical)
19528
19529 ToPlayer()->GetSession()->SendPacket(&data);
19530 }
19531}
@ SMSG_MOVE_KNOCK_BACK
Definition: Opcodes.h:269
WorldSession * GetSession() const
Definition: Player.h:1980
void MoveJumpTo(float angle, float speedXY, float speedZ)
The unit will jump in a specific direction.
Definition: MotionMaster.cpp:587
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition: WorldSession.cpp:214

References GetMotionMaster(), Position::GetOrientation(), Object::GetPackGUID(), Player::GetSession(), Object::IsCreature(), MotionMaster::MoveJumpTo(), WorldSession::SendPacket(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by Spell::EffectLeapBack().

◆ JumpTo() [2/2]

void Unit::JumpTo ( WorldObject obj,
float  speedZ 
)
19534{
19535 float x, y, z;
19536 obj->GetContactPoint(this, x, y, z);
19537 float speedXY = GetExactDist2d(x, y) * 10.0f / speedZ;
19538 GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ);
19539}
void GetContactPoint(WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
Definition: Object.cpp:2742
void MoveJump(Position const &pos, float speedXY, float speedZ, uint32 id=0)
Definition: MotionMaster.h:227

References WorldObject::GetContactPoint(), Position::GetExactDist2d(), GetMotionMaster(), and MotionMaster::MoveJump().

◆ Kill()

void Unit::Kill ( Unit killer,
Unit victim,
bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
static
Todo:
: do instance binding anyway if the charmer/owner is offline
17690{
17691 // Prevent killing unit twice (and giving reward from kill twice)
17692 if (!victim->GetHealth())
17693 return;
17694
17695 if (killer && !killer->IsInMap(victim))
17696 killer = nullptr;
17697
17698 // find player: owner of controlled `this` or `this` itself maybe
17699 Player* player = killer ? killer->GetCharmerOrOwnerPlayerOrPlayerItself() : nullptr;
17700 Creature* creature = victim->ToCreature();
17701
17702 bool isRewardAllowed = true;
17703 if (creature)
17704 {
17705 isRewardAllowed = creature->IsDamageEnoughForLootingAndReward();
17706 if (!isRewardAllowed)
17707 creature->SetLootRecipient(nullptr);
17708 }
17709
17710 // pussywizard: remade this if section (player is on the same map
17711 if (isRewardAllowed && creature)
17712 {
17713 Player* lr = creature->GetLootRecipient();
17714 if (lr && lr->IsInMap(creature))
17715 player = creature->GetLootRecipient();
17716 else if (Group* lrg = creature->GetLootRecipientGroup())
17717 for (GroupReference* itr = lrg->GetFirstMember(); itr != nullptr; itr = itr->next())
17718 if (Player* member = itr->GetSource())
17719 if (member->IsAtLootRewardDistance(creature))
17720 {
17721 player = member;
17722 break;
17723 }
17724 }
17725
17726 // Exploit fix
17727 if (creature && creature->IsPet() && creature->GetOwnerGUID().IsPlayer())
17728 isRewardAllowed = false;
17729
17730 // Reward player, his pets, and group/raid members
17731 // call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
17732 if (isRewardAllowed && player && player != victim)
17733 {
17734 WorldPacket data(SMSG_PARTYKILLLOG, (8 + 8)); // send event PARTY_KILL
17735 data << player->GetGUID(); // player with killing blow
17736 data << victim->GetGUID(); // victim
17737
17738 Player* looter = player;
17739 Group* group = player->GetGroup();
17740 bool hasLooterGuid = false;
17741
17742 if (group)
17743 {
17744 group->BroadcastPacket(&data, group->GetMemberGroup(player->GetGUID()));
17745
17746 if (creature)
17747 {
17748 group->UpdateLooterGuid(creature, true);
17749 if (group->GetLooterGuid() && group->GetLootMethod() != FREE_FOR_ALL)
17750 {
17751 looter = ObjectAccessor::FindPlayer(group->GetLooterGuid());
17752 if (looter)
17753 {
17754 hasLooterGuid = true;
17755 creature->SetLootRecipient(looter); // update creature loot recipient to the allowed looter.
17756 }
17757 }
17758 }
17759 }
17760 else
17761 {
17762 player->SendDirectMessage(&data);
17763
17764 if (creature)
17765 {
17766 WorldPacket data2(SMSG_LOOT_LIST, 8 + 1 + 1);
17767 data2 << creature->GetGUID();
17768 data2 << uint8(0); // unk1
17769 data2 << uint8(0); // no group looter
17770 player->SendMessageToSet(&data2, true);
17771 }
17772 }
17773
17774 // Generate loot before updating looter
17775 if (creature)
17776 {
17777 Loot* loot = &creature->loot;
17778 loot->clear();
17779
17780 if (uint32 lootid = creature->GetCreatureTemplate()->lootid)
17781 loot->FillLoot(lootid, LootTemplates_Creature, looter, false, false, creature->GetLootMode(), creature);
17782
17783 if (creature->GetLootMode())
17785
17786 if (group)
17787 {
17788 if (hasLooterGuid)
17789 group->SendLooter(creature, looter);
17790 else
17791 group->SendLooter(creature, nullptr);
17792
17793 // Update round robin looter only if the creature had loot
17794 if (!creature->loot.empty())
17795 group->UpdateLooterGuid(creature);
17796 }
17797 }
17798
17799 player->RewardPlayerAndGroupAtKill(victim, false);
17800 }
17801
17802 // Do KILL and KILLED procs. KILL proc is called only for the unit who landed the killing blow (and its owner - for pets and totems) regardless of who tapped the victim
17803 if (killer && (killer->IsPet() || killer->IsTotem()))
17804 if (Unit* owner = killer->GetOwner())
17805 {
17806 Unit::ProcDamageAndSpell(owner, victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17807 sScriptMgr->OnCreatureKilledByPet( killer->GetCharmerOrOwnerPlayerOrPlayerItself(), victim->ToCreature());
17808 }
17809
17810 if (killer != victim)
17811 {
17812 Unit::ProcDamageAndSpell(killer, victim, killer ? PROC_FLAG_KILL : 0, PROC_FLAG_KILLED, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17813 }
17814
17815 // Proc auras on death - must be before aura/combat remove
17816 Unit::ProcDamageAndSpell(victim, nullptr, PROC_FLAG_DEATH, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17817
17818 // update get killing blow achievements, must be done before setDeathState to be able to require auras on target
17819 // and before Spirit of Redemption as it also removes auras
17820 if (killer)
17821 if (Player* killerPlayer = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
17822 killerPlayer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim);
17823
17824 // Spirit of Redemption
17825 // if talent known but not triggered (check priest class for speedup check)
17826 bool spiritOfRedemption = false;
17828 {
17829 if (AuraEffect* aurEff = victim->GetAuraEffectDummy(20711))
17830 {
17831 // Xinef: aura_spirit_of_redemption is triggered by 27827 shapeshift
17832 if (victim->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION) || victim->HasAura(27827))
17833 {
17834 /*LOG_INFO("misc", "Player ({}) died with spirit of redemption. Killer (Entry: {}, Name: {}), Map: {}, x: {}, y: {}, z: {}",
17835 victim->GetGUID().ToString(), killer ? killer->GetEntry() : 1, killer ? killer->GetName() : "", victim->GetMapId(), victim->GetPositionX(),
17836 victim->GetPositionY(), victim->GetPositionZ());
17837
17838 ACE_Stack_Trace trace(0, 50);
17839 LOG_INFO("misc", "TRACE: {}\n\n", trace);*/
17840 }
17841 else
17842 {
17843 // save value before aura remove
17844 uint32 ressSpellId = victim->GetUInt32Value(PLAYER_SELF_RES_SPELL);
17845 if (!ressSpellId)
17846 ressSpellId = victim->ToPlayer()->GetResurrectionSpellId();
17847
17848 //Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers)
17849 victim->RemoveAllAurasOnDeath();
17850
17851 // Stop attacks
17852 victim->CombatStop();
17854
17855 // restore for use at real death
17856 victim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId);
17857
17858 // FORM_SPIRITOFREDEMPTION and related auras
17859 victim->CastSpell(victim, 27827, true, nullptr, aurEff);
17860 spiritOfRedemption = true;
17861 }
17862 }
17863 }
17864
17865 if (!spiritOfRedemption)
17866 {
17867 LOG_DEBUG("entities.unit", "SET DeathState::JustDied");
17868 victim->setDeathState(DeathState::JustDied);
17869 }
17870
17871 // Inform pets (if any) when player kills target)
17872 // MUST come after victim->setDeathState(DeathState::JustDied); or pet next target
17873 // selection will get stuck on same target and break pet react state
17874 if (player)
17875 {
17876 Pet* pet = player->GetPet();
17877 if (pet && pet->IsAlive() && pet->isControlled())
17878 pet->AI()->KilledUnit(victim);
17879 }
17880
17881 // 10% durability loss on death
17882 // clean InHateListOf
17883 if (Player* plrVictim = victim->ToPlayer())
17884 {
17885 // remember victim PvP death for corpse type and corpse reclaim delay
17886 // at original death (not at SpiritOfRedemtionTalent timeout)
17887 plrVictim->SetPvPDeath(player != nullptr);
17888
17889 // only if not player and not controlled by player pet. And not at BG
17890 if ((durabilityLoss && !player && !plrVictim->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))
17891 {
17892 LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH));
17893 plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH), false);
17894 // durability lost message
17895 plrVictim->SendDurabilityLoss();
17896 }
17897 // Call KilledUnit for creatures
17898 if (killer && killer->IsCreature() && killer->IsAIEnabled)
17899 killer->ToCreature()->AI()->KilledUnit(victim);
17900
17901 // last damage from non duel opponent or opponent controlled creature
17902 if (plrVictim->duel)
17903 {
17904 plrVictim->duel->Opponent->CombatStopWithPets(true);
17905 plrVictim->CombatStopWithPets(true);
17906 plrVictim->DuelComplete(DUEL_INTERRUPTED);
17907 }
17908 }
17909 else // creature died
17910 {
17911 LOG_DEBUG("entities.unit", "DealDamageNotPlayer");
17912
17913 if (!creature->IsPet() && creature->GetLootMode() > 0)
17914 {
17915 creature->GetThreatMgr().ClearAllThreat();
17916
17917 // must be after setDeathState which resets dynamic flags
17918 if (!creature->loot.isLooted())
17919 {
17921 }
17922 else
17923 {
17924 creature->AllLootRemovedFromCorpse();
17925 }
17926 }
17927
17928 // Call KilledUnit for creatures, this needs to be called after the lootable flag is set
17929 if (killer && killer->IsCreature() && killer->IsAIEnabled)
17930 killer->ToCreature()->AI()->KilledUnit(victim);
17931
17932 // Call creature just died function
17933 if (CreatureAI* ai = creature->AI())
17934 {
17935 ai->JustDied(killer);
17936 }
17937
17938 if (TempSummon* summon = creature->ToTempSummon())
17939 {
17940 if (WorldObject* summoner = summon->GetSummoner())
17941 {
17942 if (summoner->ToCreature() && summoner->ToCreature()->IsAIEnabled)
17943 {
17944 summoner->ToCreature()->AI()->SummonedCreatureDies(creature, killer);
17945 }
17946 else if (summoner->ToGameObject() && summoner->ToGameObject()->AI())
17947 {
17948 summoner->ToGameObject()->AI()->SummonedCreatureDies(creature, killer);
17949 }
17950 }
17951 }
17952
17953 // Dungeon specific stuff, only applies to players killing creatures
17954 if (creature->GetInstanceId())
17955 {
17956 Map* instanceMap = creature->GetMap();
17957 //Player* creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
17959
17960 if (instanceMap->IsDungeon() && player)
17961 if (instanceMap->IsRaidOrHeroicDungeon())
17963 instanceMap->ToInstanceMap()->PermBindAllPlayers();
17964 }
17965 }
17966
17967 // outdoor pvp things, do these after setting the death state, else the player activity notify won't work... doh...
17968 // handle player kill only if not suicide (spirit of redemption for example)
17969 if (player && killer != victim)
17970 {
17971 if (OutdoorPvP* pvp = player->GetOutdoorPvP())
17972 pvp->HandleKill(player, victim);
17973
17974 if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId()))
17975 bf->HandleKill(player, victim);
17976 }
17977
17978 //if (victim->IsPlayer())
17979 // if (OutdoorPvP* pvp = victim->ToPlayer()->GetOutdoorPvP())
17980 // pvp->HandlePlayerActivityChangedpVictim->ToPlayer();
17981
17982 // battleground things (do this at the end, so the death state flag will be properly set to handle in the bg->handlekill)
17983 if (player)
17984 if (Battleground* bg = player->GetBattleground())
17985 {
17986 if (victim->IsPlayer())
17987 bg->HandleKillPlayer(victim->ToPlayer(), player);
17988 else
17989 bg->HandleKillUnit(victim->ToCreature(), player);
17990 }
17991
17992 // achievement stuff
17993 if (killer && victim->IsPlayer())
17994 {
17995 if (killer->IsCreature())
17997 else if (victim != killer && killer->IsPlayer())
17999 }
18000
18001 // Hook for OnPVPKill Event
18002 if (killer)
18003 {
18004 if (Player* killerPlr = killer->ToPlayer())
18005 {
18006 if (Player* killedPlr = victim->ToPlayer())
18007 sScriptMgr->OnPVPKill(killerPlr, killedPlr);
18008 else if (Creature* killedCre = victim->ToCreature())
18009 sScriptMgr->OnCreatureKill(killerPlr, killedCre);
18010 }
18011 else if (Creature* killerCre = killer->ToCreature())
18012 {
18013 if (Player* killed = victim->ToPlayer())
18014 sScriptMgr->OnPlayerKilledByCreature(killerCre, killed);
18015 }
18016 }
18017
18018 sScriptMgr->OnUnitDeath(victim, killer);
18019}
@ PROC_FLAG_KILLED
Definition: SpellMgr.h:107
#define sBattlefieldMgr
Definition: BattlefieldMgr.h:77
LootStore LootTemplates_Creature("creature_loot_template", "creature entry", true)
@ FREE_FOR_ALL
Definition: LootMgr.h:59
@ CONFIG_DURABILITY_LOSS_IN_PVP
Definition: IWorld.h:66
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition: IWorld.h:512
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition: Player.h:488
@ CREATURE_FLAG_EXTRA_INSTANCE_BIND
Definition: CreatureData.h:46
@ PLAYER_SELF_RES_SPELL
Definition: UpdateFields.h:370
@ UNIT_DYNFLAG_LOOTABLE
Definition: SharedDefines.h:3121
@ DUEL_INTERRUPTED
Definition: SharedDefines.h:3612
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER
Definition: DBCEnums.h:138
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE
Definition: DBCEnums.h:137
@ ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS
Definition: DBCEnums.h:170
@ SMSG_PARTYKILLLOG
Definition: Opcodes.h:531
@ SMSG_LOOT_LIST
Definition: Opcodes.h:1047
Player * FindPlayer(ObjectGuid const guid)
Definition: ObjectAccessor.cpp:245
Definition: CreatureAI.h:70
virtual void KilledUnit(Unit *)
Definition: CreatureAI.h:129
Definition: Battlefield.h:204
Loot loot
Definition: Creature.h:229
uint16 GetLootMode() const
Definition: Creature.h:243
void AllLootRemovedFromCorpse()
Definition: Creature.cpp:2987
Player * GetLootRecipient() const
Definition: Creature.cpp:1305
bool IsDamageEnoughForLootingAndReward() const
Definition: Creature.cpp:3800
Group * GetLootRecipientGroup() const
Definition: Creature.cpp:1312
uint32 mingold
Definition: CreatureData.h:232
uint32 maxgold
Definition: CreatureData.h:233
uint32 lootid
Definition: CreatureData.h:225
virtual void SetDynamicFlag(uint32 flag)
Definition: Object.h:120
uint32 GetInstanceId() const
Definition: Object.h:443
uint32 GetZoneId() const
Definition: Object.cpp:3146
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:5692
TeamId GetTeamId(bool original=false) const
Definition: Player.h:2090
Battleground * GetBattleground(bool create=false) const
Definition: Player.cpp:12195
uint32 GetResurrectionSpellId()
Definition: Player.cpp:12611
OutdoorPvP * GetOutdoorPvP() const
Definition: Player.cpp:12512
void RewardPlayerAndGroupAtKill(Unit *victim, bool isBattleGround)
Definition: Player.cpp:12731
void RemoveAllAurasOnDeath()
Definition: Unit.cpp:5349
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition: Unit.cpp:5550
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition: Group.cpp:1757
uint8 GetMemberGroup(ObjectGuid guid) const
Definition: Group.cpp:2384
ObjectGuid GetLooterGuid() const
Definition: Group.cpp:2321
LootMethod GetLootMethod() const
Definition: Group.cpp:2316
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition: Group.cpp:1868
void SendLooter(Creature *creature, Player *pLooter)
Definition: Group.cpp:969
Definition: LootMgr.h:313
bool empty() const
Definition: LootMgr.h:367
bool isLooted() const
Definition: LootMgr.h:368
void clear()
Definition: LootMgr.h:343
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
Definition: LootMgr.cpp:831
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition: LootMgr.cpp:564
Definition: Map.h:313
bool IsRaidOrHeroicDungeon() const
Definition: Map.h:451
InstanceMap * ToInstanceMap()
Definition: Map.h:546
void PermBindAllPlayers()
Definition: Map.cpp:3152
Definition: OutdoorPvP.h:186

References ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, Creature::AI(), Creature::AllLootRemovedFromCorpse(), Group::BroadcastPacket(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_PRIEST, Loot::clear(), ThreatMgr::ClearAllThreat(), CombatStop(), CONFIG_DURABILITY_LOSS_IN_PVP, CREATURE_FLAG_EXTRA_INSTANCE_BIND, HostileRefMgr::deleteReferences(), DUEL_INTERRUPTED, Loot::empty(), Loot::FillLoot(), ObjectAccessor::FindPlayer(), CreatureTemplate::flags_extra, FREE_FOR_ALL, Loot::generateMoneyLoot(), GetAuraEffectDummy(), Player::GetBattleground(), GetCharmerOrOwnerPlayerOrPlayerItself(), Creature::GetCreatureTemplate(), Object::GetEntry(), Player::GetGroup(), Object::GetGUID(), GetHealth(), getHostileRefMgr(), WorldObject::GetInstanceId(), Group::GetLooterGuid(), Group::GetLootMethod(), Creature::GetLootMode(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), WorldObject::GetMap(), Group::GetMemberGroup(), Player::GetOutdoorPvP(), GetOwner(), GetOwnerGUID(), Player::GetPet(), Player::GetResurrectionSpellId(), Player::GetTeamId(), GetThreatMgr(), Object::GetUInt32Value(), WorldObject::GetZoneId(), HasAura(), HasAuraType(), Player::HasPlayerFlag(), Player::InBattleground(), IsAIEnabled, IsAlive(), IsClass(), Pet::isControlled(), Object::IsCreature(), Creature::IsDamageEnoughForLootingAndReward(), Map::IsDungeon(), WorldObject::IsInMap(), Loot::isLooted(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), Map::IsRaidOrHeroicDungeon(), IsTotem(), CreatureAI::KilledUnit(), LOG_DEBUG, Creature::loot, CreatureTemplate::lootid, LootTemplates_Creature, CreatureTemplate::maxgold, CreatureTemplate::mingold, GroupReference::next(), InstanceMap::PermBindAllPlayers(), PLAYER_FLAGS_IS_OUT_OF_BOUNDS, PLAYER_SELF_RES_SPELL, PROC_EX_NONE, PROC_FLAG_DEATH, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_FLAG_NONE, ProcDamageAndSpell(), RATE_DURABILITY_LOSS_ON_DEATH, RemoveAllAurasOnDeath(), Player::RewardPlayerAndGroupAtKill(), sBattlefieldMgr, Player::SendDirectMessage(), Group::SendLooter(), Player::SendMessageToSet(), setDeathState(), Object::SetDynamicFlag(), Creature::SetLootRecipient(), SetUInt32Value(), SMSG_LOOT_LIST, SMSG_PARTYKILLLOG, SPELL_AURA_SPIRIT_OF_REDEMPTION, sScriptMgr, sWorld, Object::ToCreature(), Map::ToInstanceMap(), Object::ToPlayer(), ToTempSummon(), UNIT_DYNFLAG_LOOTABLE, Player::UpdateAchievementCriteria(), and Group::UpdateLooterGuid().

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), boss_headless_horseman_head::DamageTaken(), boss_viscidus::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_brutallus::boss_brutallusAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), boss_jedoga_shadowseeker::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_illidari_council::DoAction(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), DeathEvent::Execute(), AuraEffect::HandleAuraControlVehicle(), BattlegroundIC::HandleCapturedNodes(), misc_commandscript::HandleDieCommand(), spell_ooze_zap_channel_end::HandleDummy(), spell_pos_rimefang_frost_nova::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_yogg_saron_titanic_storm::HandleDummyEffect(), spell_item_rocket_chicken::HandleDummyTick(), spell_ulduar_arachnopod_damaged_aura::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_teron_gorefiend_spiritual_vengeance::HandleEffectRemove(), spell_voa_overcharge::spell_voa_overcharge_AuraScript::HandlePeriodicDummy(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_leotheras_clear_consuming_madness::HandleScriptEffect(), boss_kiljaeden::boss_kiljaedenAI::JustDied(), boss_entropius::boss_entropiusAI::JustDied(), boss_twin_valkyrAI::JustDied(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_sister_svalna::boss_sister_svalnaAI::JustDied(), boss_ignis::boss_ignisAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), boss_ahune::JustDied(), npc_frozen_core::JustDied(), boss_twinemperorsAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), KillSelf(), boss_buru::ManipulateEggs(), npc_burning_spirit::npc_burning_spiritAI::MovementInform(), spell_yogg_saron_insane_aura::OnRemove(), WretchedGhoulCleaner::operator()(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::PassengerBoarded(), SmartScript::ProcessAction(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::RandomizeCompositionsAndShow(), boss_faerlina::boss_faerlinaAI::SpellHit(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::Update(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::Update(), instance_shattered_halls::instance_shattered_halls_InstanceMapScript::Update(), SimpleCharmedAI::UpdateAI(), boss_selin_fireheart::UpdateAI(), npc_crusade_persuaded::npc_crusade_persuadedAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_sinkhole_kill_credit::npc_sinkhole_kill_creditAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), and npc_emily::npc_emilyAI::WaypointReached().

◆ KillSelf()

void Unit::KillSelf ( bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
inline
999{ Kill(this, this, durabilityLoss, attackType, spellProto, spell); };

References Kill().

Referenced by npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_illidari_council::DoAction(), npc_xt002_boombot::npc_xt002_boombotAI::Explode(), npc_raging_flames::FixateRandomTarget(), npc_rancid_mushroom::InitializeAI(), boss_warlord_kalithresh::JustDied(), npc_pet_gen_plump_turkey::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), npc_announcer_toc5::npc_announcer_toc5AI::MovementInform(), boss_glob_of_viscidus::MovementInform(), SmartScript::ProcessAction(), boss_archimonde::Reset(), npc_dark_iron_guzzler::SpellHit(), boss_victor_nefarius::boss_victor_nefariusAI::SummonedCreatureDies(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDies(), npc_icc_gauntlet_controller::npc_icc_gauntlet_controllerAI::SummonedCreatureDies(), boss_vazruden_the_herald::SummonedCreatureDies(), npc_warden_mellichar::npc_warden_mellicharAI::SummonedCreatureDies(), boss_felblood_kaelthas::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_singularity::npc_singularityAI::UpdateAI(), npc_brewfest_super_brew_trigger::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and npc_frost_tomb::npc_frost_tombAI::UpdateAI().

◆ KnockbackFrom()

void Unit::KnockbackFrom ( float  x,
float  y,
float  speedXY,
float  speedZ 
)
19131{
19132 Player* player = ToPlayer();
19133 if (!player)
19134 {
19135 if (Unit* charmer = GetCharmer())
19136 {
19137 player = charmer->ToPlayer();
19138 if (player && player->m_mover != this)
19139 player = nullptr;
19140 }
19141 }
19142
19143 if (!player)
19144 {
19145 GetMotionMaster()->MoveKnockbackFrom(x, y, speedXY, speedZ);
19146 }
19147 else
19148 {
19149 float vcos, vsin;
19150 GetSinCos(x, y, vsin, vcos);
19151
19152 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19153 data << GetPackGUID();
19154 data << uint32(0); // counter
19155 data << float(vcos); // x direction
19156 data << float(vsin); // y direction
19157 data << float(speedXY); // Horizontal speed
19158 data << float(-speedZ); // Z Movement speed (vertical)
19159
19160 player->GetSession()->SendPacket(&data);
19161
19163 player->SetCanFly(true, true);
19164
19165 player->SetCanKnockback(true);
19166 }
19167}
@ SPELL_AURA_FLY
Definition: SpellAuraDefines.h:264
@ SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED
Definition: SpellAuraDefines.h:270
void GetSinCos(float x, float y, float &vsin, float &vcos) const
Definition: Position.cpp:91
SafeUnitPointer m_mover
Definition: Player.h:2315
void SetCanKnockback(bool value)
Definition: Player.h:2482
bool SetCanFly(bool apply, bool packetOnly=false) override
Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pre...
Definition: Player.cpp:15924
void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ)
Definition: MotionMaster.cpp:558

References GetCharmer(), GetMotionMaster(), Object::GetPackGUID(), Player::GetSession(), Position::GetSinCos(), HasAuraType(), Player::m_mover, MotionMaster::MoveKnockbackFrom(), WorldSession::SendPacket(), Player::SetCanFly(), Player::SetCanKnockback(), SMSG_MOVE_KNOCK_BACK, SPELL_AURA_FLY, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, and Object::ToPlayer().

Referenced by _ExitVehicle(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), Spell::EffectKnockBack(), spell_warhead_detonate::HandleDummy(), npc_vekjik::OnGossipSelect(), and npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI().

◆ MagicSpellHitResult()

SpellMissInfo Unit::MagicSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3328{
3329 // Can`t miss on dead target (on skinning for example)
3330 if (!victim->IsAlive() && !victim->IsPlayer())
3331 return SPELL_MISS_NONE;
3332
3333 // vehicles cant miss
3334 if (IsVehicle())
3335 return SPELL_MISS_NONE;
3336
3337 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3338 // resist and deflect chances
3339 // xinef: skip all calculations, proof: Toxic Tolerance quest
3340 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3341 return SPELL_MISS_NONE;
3342
3343 if (spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
3344 {
3345 return SPELL_MISS_NONE;
3346 }
3347
3348 SpellSchoolMask schoolMask = spellInfo->GetSchoolMask();
3349 int32 thisLevel = getLevelForTarget(victim);
3350 if (IsCreature() && ToCreature()->IsTrigger())
3351 thisLevel = std::max<int32>(thisLevel, spellInfo->SpellLevel);
3352 int32 levelDiff = int32(victim->getLevelForTarget(this)) - thisLevel;
3353
3354 int32 MISS_CHANCE_MULTIPLIER;
3355 if (sWorld->getBoolConfig(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS) && !IsPlayer()) // keep it as it was originally (7 and 11)
3356 {
3357 MISS_CHANCE_MULTIPLIER = victim->IsPlayer() ? 7 : 11;
3358 }
3359 else
3360 {
3361 MISS_CHANCE_MULTIPLIER = sWorld->getRate(
3362 victim->IsPlayer()
3365 }
3366
3367 // Base hit chance from attacker and victim levels
3368 int32 modHitChance = levelDiff < 3
3369 ? 96 - levelDiff
3370 : 94 - (levelDiff - 2) * MISS_CHANCE_MULTIPLIER;
3371
3372 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
3373 if (Player* modOwner = GetSpellModOwner())
3374 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_RESIST_MISS_CHANCE, modHitChance);
3375
3376 // Increase from attacker SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT auras
3378
3379 // Spells with SPELL_ATTR3_ALWAYS_HIT will ignore target's avoidance effects
3380 // xinef: imo it should completly ignore all calculations, eg: 14792. Hits 80 level players on blizz without any problems
3381 //if (!spell->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3382 {
3383 // Chance hit from victim SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE auras
3385 // Reduce spell hit chance for Area of effect spells from victim SPELL_AURA_MOD_AOE_AVOIDANCE aura
3386 if (spellInfo->IsAffectingArea())
3387 modHitChance -= victim->GetTotalAuraModifier(SPELL_AURA_MOD_AOE_AVOIDANCE);
3388
3389 // Decrease hit chance from victim rating bonus
3390 if (victim->IsPlayer())
3391 modHitChance -= int32(victim->ToPlayer()->GetRatingBonusValue(CR_HIT_TAKEN_SPELL));
3392 }
3393
3394 int32 HitChance = modHitChance * 100;
3395 // Increase hit chance from attacker SPELL_AURA_MOD_SPELL_HIT_CHANCE and attacker ratings
3396 // Xinef: Totems should inherit casters ratings?
3397 if (IsTotem())
3398 {
3399 if (Unit* owner = GetOwner())
3400 HitChance += int32(owner->m_modSpellHitChance * 100.0f);
3401 }
3402 else
3403 HitChance += int32(m_modSpellHitChance * 100.0f);
3404
3405 if (HitChance < 100)
3406 HitChance = 100;
3407 else if (HitChance > 10000)
3408 HitChance = 10000;
3409
3410 int32 tmp = 10000 - HitChance;
3411
3412 int32 rand = irand(1, 10000); // Needs to be 1 to 10000 to avoid the 1/10000 chance to miss on 100% hit rating
3413
3414 if (rand < tmp)
3415 return SPELL_MISS_MISS;
3416
3417 // Chance resist mechanic (select max value from every mechanic spell effect)
3418 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3419 tmp += resist_chance;
3420
3421 // Chance resist debuff
3422 if (!spellInfo->IsPositive() && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))
3423 {
3424 bool bNegativeAura = true;
3425 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3426 {
3427 // Xinef: Check if effect exists!
3428 if (spellInfo->Effects[i].IsEffect() && spellInfo->Effects[i].ApplyAuraName == 0)
3429 {
3430 bNegativeAura = false;
3431 break;
3432 }
3433 }
3434
3435 if (bNegativeAura)
3436 {
3437 tmp += victim->GetMaxPositiveAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3438 tmp += victim->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3439 }
3440
3441 // Players resistance for binary spells
3442 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && (spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_NORMAL | SPELL_SCHOOL_MASK_HOLY)) == 0)
3443 tmp += int32(Unit::GetEffectiveResistChance(this, spellInfo->GetSchoolMask(), victim) * 10000.0f); // 100 for spell calculations, and 100 for return value percentage
3444 }
3445
3446 // Roll chance
3447 if (rand < tmp)
3448 return SPELL_MISS_RESIST;
3449
3450 // cast by caster in front of victim
3451 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION)))
3452 {
3453 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3454 tmp += deflect_chance;
3455 if (rand < tmp)
3456 return SPELL_MISS_DEFLECT;
3457 }
3458
3459 return SPELL_MISS_NONE;
3460}
@ SPELLMOD_RESIST_MISS_CHANCE
Definition: SpellDefines.h:92
@ SPELL_AURA_MOD_DEBUFF_RESISTANCE
Definition: SpellAuraDefines.h:241
@ SPELL_AURA_DEFLECT_SPELLS
Definition: SpellAuraDefines.h:350
@ SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT
Definition: SpellAuraDefines.h:262
@ SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE
Definition: SpellAuraDefines.h:249
@ SPELL_AURA_MOD_AOE_AVOIDANCE
Definition: SpellAuraDefines.h:223
@ CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS
Definition: IWorld.h:173
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER
Definition: IWorld.h:519
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE
Definition: IWorld.h:518
@ CR_HIT_TAKEN_SPELL
Definition: Unit.h:230
@ SPELL_ATTR7_NO_ATTACK_MISS
Definition: SharedDefines.h:666
@ SPELL_MISS_NONE
Definition: SharedDefines.h:1519
@ SPELL_MISS_RESIST
Definition: SharedDefines.h:1521
@ SPELL_MISS_MISS
Definition: SharedDefines.h:1520
@ SPELL_MISS_DEFLECT
Definition: SharedDefines.h:1528
float GetRatingBonusValue(CombatRating cr) const
Definition: Player.cpp:5185
int32 GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:6052
int32 GetMaxPositiveAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:6038
int32 GetMechanicResistChance(SpellInfo const *spell)
Definition: Unit.cpp:3133

References CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS, CR_HIT_TAKEN_SPELL, SpellInfo::Dispel, SpellInfo::Effects, GetEffectiveResistChance(), getLevelForTarget(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifierByMiscValue(), GetMechanicResistChance(), GetOwner(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), HasAuraType(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, irand(), SpellInfo::IsAffectingArea(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), SpellInfo::IsPositive(), IsTotem(), IsVehicle(), m_modSpellHitChance, MAX_SPELL_EFFECTS, RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE, RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER, SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_NO_CAST_LOG, SPELL_ATTR7_NO_ATTACK_MISS, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_IGNORE_HIT_DIRECTION, SPELL_AURA_MOD_AOE_AVOIDANCE, SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE, SPELL_AURA_MOD_DEBUFF_RESISTANCE, SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT, SPELL_MISS_DEFLECT, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_RESIST, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NORMAL, SpellInfo::SpellLevel, SPELLMOD_RESIST_MISS_CHANCE, sWorld, Object::ToCreature(), Object::ToPlayer(), and UNIT_STATE_STUNNED.

Referenced by SpellHitResult().

◆ MeleeDamageBonusDone()

uint32 Unit::MeleeDamageBonusDone ( Unit pVictim,
uint32  damage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13061{
13062 if (!victim || pdamage == 0)
13063 return 0;
13064
13065 if (IsCreature())
13066 {
13067 // Dancing Rune Weapon...
13068 if (GetEntry() == 27893)
13069 {
13070 if (Unit* owner = GetOwner())
13071 return owner->MeleeDamageBonusDone(victim, pdamage, attType, spellProto, damageSchoolMask) / 2;
13072 }
13073 }
13074
13075 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
13076
13077 // Done fixed damage bonus auras
13078 int32 DoneFlatBenefit = 0;
13079
13080 // ..done
13082 for (AuraEffectList::const_iterator i = mDamageDoneCreature.begin(); i != mDamageDoneCreature.end(); ++i)
13083 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13084 DoneFlatBenefit += (*i)->GetAmount();
13085
13086 // ..done
13087 // SPELL_AURA_MOD_DAMAGE_DONE included in weapon damage
13088
13089 // ..done (base at attack power for marked target and base at attack power for creature type)
13090 int32 APbonus = 0;
13091
13092 if (attType == RANGED_ATTACK)
13093 {
13094 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
13095
13096 // ..done (base at attack power and creature type)
13098 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13099 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13100 APbonus += (*i)->GetAmount();
13101 }
13102 else
13103 {
13104 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
13105
13106 // ..done (base at attack power and creature type)
13108 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13109 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13110 APbonus += (*i)->GetAmount();
13111 }
13112
13113 if (APbonus != 0) // Can be negative
13114 {
13115 bool normalized = false;
13116 if (spellProto)
13117 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13118 if (spellProto->Effects[i].Effect == SPELL_EFFECT_NORMALIZED_WEAPON_DMG)
13119 {
13120 normalized = true;
13121 break;
13122 }
13123 DoneFlatBenefit += int32(APbonus / 14.0f * GetAPMultiplier(attType, normalized));
13124 }
13125
13126 // Done total percent damage auras
13127 float DoneTotalMod = 1.0f;
13128
13129 // mods for SPELL_SCHOOL_MASK_NORMAL are already factored in base melee damage calculation
13130 if (!(damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL))
13131 {
13132 // Some spells don't benefit from pct done mods
13134 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
13135 {
13136 if (!spellProto || (spellProto->ValidateAttribute6SpellDamageMods(this, *i, false) &&
13137 sScriptMgr->IsNeedModMeleeDamagePercent(this, *i, DoneTotalMod, spellProto)))
13138 {
13139 if (((*i)->GetMiscValue() & damageSchoolMask))
13140 {
13141 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
13142 AddPct(DoneTotalMod, (*i)->GetAmount());
13143 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
13144 AddPct(DoneTotalMod, (*i)->GetAmount());
13145 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
13146 AddPct(DoneTotalMod, (*i)->GetAmount());
13147 }
13148 }
13149 }
13150 }
13151
13153 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
13154 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13155 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13156 AddPct(DoneTotalMod, (*i)->GetAmount());
13157
13158 // bonus against aurastate
13160 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
13161 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())))
13162 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13163 AddPct(DoneTotalMod, (*i)->GetAmount());
13164
13165 // done scripted mod (take it from owner)
13166 Unit* owner = GetOwner() ? GetOwner() : this;
13167 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13168 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
13169 {
13170 if (spellProto && !spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13171 continue;
13172
13173 if (!(*i)->IsAffectedOnSpell(spellProto))
13174 continue;
13175
13176 switch ((*i)->GetMiscValue())
13177 {
13178 // Tundra Stalker
13179 // Merciless Combat
13180 case 7277:
13181 {
13182 // Merciless Combat
13183 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
13184 {
13185 if (!victim->HealthAbovePct(35))
13186 AddPct(DoneTotalMod, (*i)->GetAmount());
13187 }
13188 // Tundra Stalker
13189 else
13190 {
13191 // Frost Fever (target debuff)
13192 if (victim->HasAura(55095))
13193 AddPct(DoneTotalMod, (*i)->GetAmount());
13194 }
13195 break;
13196 }
13197 // Rage of Rivendare
13198 case 7293:
13199 {
13200 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0x02000000, 0))
13201 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
13202 break;
13203 }
13204 // Marked for Death
13205 case 7598:
13206 case 7599:
13207 case 7600:
13208 case 7601:
13209 case 7602:
13210 {
13211 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
13212 AddPct(DoneTotalMod, (*i)->GetAmount());
13213 break;
13214 }
13215 // Dirty Deeds
13216 case 6427:
13217 case 6428:
13218 {
13219 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
13220 {
13221 // effect 0 has expected value but in negative state
13222 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
13223 AddPct(DoneTotalMod, bonus);
13224 }
13225 break;
13226 }
13227 }
13228 }
13229
13230 // Custom scripted damage
13231 if (spellProto)
13232 switch (spellProto->SpellFamilyName)
13233 {
13235 // Glacier Rot
13236 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
13238 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
13239 AddPct(DoneTotalMod, aurEff->GetAmount());
13240 break;
13241 }
13242
13243 // Some spells don't benefit from done mods
13244 if (spellProto)
13245 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
13246 {
13247 DoneFlatBenefit = 0;
13248 DoneTotalMod = 1.0f;
13249 }
13250
13251 float tmpDamage = float(int32(pdamage) + DoneFlatBenefit) * DoneTotalMod;
13252
13253 // apply spellmod to Done damage
13254 if (spellProto)
13255 if (Player* modOwner = GetSpellModOwner())
13256 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_DAMAGE, tmpDamage);
13257
13258 // bonus result can be negative
13259 return uint32(std::max(tmpDamage, 0.0f));
13260}
@ SPELLMOD_DAMAGE
Definition: SpellDefines.h:76
@ SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS
Definition: SpellAuraDefines.h:165
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS
Definition: SpellAuraDefines.h:231
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS
Definition: SpellAuraDefines.h:194
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition: SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE
Definition: SpellAuraDefines.h:366
@ SPELL_AURA_MOD_DAMAGE_DONE_CREATURE
Definition: SpellAuraDefines.h:122
@ SPELL_EFFECT_NORMALIZED_WEAPON_DMG
Definition: SharedDefines.h:899
@ SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM
Definition: SharedDefines.h:583
@ SPELL_ATTR3_IGNORE_CASTER_MODIFIERS
Definition: SharedDefines.h:522
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition: Unit.cpp:17205
AuraEffect * GetDummyAuraEffect(SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
Definition: Unit.h:1383

References AddPct(), AURA_STATE_HEALTHLESS_35_PERCENT, SpellInfo::Effects, GetAPMultiplier(), GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), GetSpellModOwner(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HealthAbovePct(), SpellInfo::Id, Object::IsCreature(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_DAMAGE_DONE_CREATURE, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_EFFECT_NORMALIZED_WEAPON_DMG, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_DAMAGE, sScriptMgr, Object::ToPlayer(), and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeDamageBonusTaken()

uint32 Unit::MeleeDamageBonusTaken ( Unit attacker,
uint32  pdamage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13263{
13264 if (pdamage == 0)
13265 return 0;
13266
13267 int32 TakenFlatBenefit = 0;
13268
13269 // ..taken
13271 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
13272 if ((*i)->GetMiscValue() & damageSchoolMask)
13273 TakenFlatBenefit += (*i)->GetAmount();
13274
13275 if (attType != RANGED_ATTACK)
13277 else
13279
13280 // Taken total percent damage auras
13281 float TakenTotalMod = 1.0f;
13282
13284
13285 // .. taken pct (special attacks)
13286 if (spellProto)
13287 {
13288 // From caster spells
13290 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
13291 if ((*i)->GetCasterGUID() == attacker->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
13292 AddPct(TakenTotalMod, (*i)->GetAmount());
13293
13294 // Mod damage from spell mechanic
13295 uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask();
13296
13297 // Shred, Maul - "Effects which increase Bleed damage also increase Shred damage"
13298 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[0] & 0x00008800)
13299 mechanicMask |= (1 << MECHANIC_BLEED);
13300
13301 if (mechanicMask)
13302 {
13304 for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i)
13305 if (mechanicMask & uint32(1 << ((*i)->GetMiscValue())))
13306 AddPct(TakenTotalMod, (*i)->GetAmount());
13307 }
13308 }
13309
13310 TakenTotalMod = processDummyAuras(TakenTotalMod);
13311
13312 // .. taken pct: class scripts
13313 /*AuraEffectList const& mclassScritAuras = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13314 for (AuraEffectList::const_iterator i = mclassScritAuras.begin(); i != mclassScritAuras.end(); ++i)
13315 {
13316 switch ((*i)->GetMiscValue())
13317 {
13318 }
13319 }*/
13320
13321 if (attType != RANGED_ATTACK)
13322 {
13324 for (AuraEffectList::const_iterator i = mModMeleeDamageTakenPercent.begin(); i != mModMeleeDamageTakenPercent.end(); ++i)
13325 AddPct(TakenTotalMod, (*i)->GetAmount());
13326 }
13327 else
13328 {
13329 AuraEffectList const& mModRangedDamageTakenPercent = GetAuraEffectsByType(SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT);
13330 for (AuraEffectList::const_iterator i = mModRangedDamageTakenPercent.begin(); i != mModRangedDamageTakenPercent.end(); ++i)
13331 AddPct(TakenTotalMod, (*i)->GetAmount());
13332 }
13333
13334 // No positive taken bonus, custom attr
13335 if (spellProto)
13336 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
13337 {
13338 TakenFlatBenefit = 0;
13339 TakenTotalMod = 1.0f;
13340 }
13341
13342 // xinef: sanctified wrath talent
13343 if (TakenTotalMod < 1.0f && attacker->HasAuraType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST))
13344 {
13345 float ignoreModifier = 1.0f - TakenTotalMod;
13346 bool addModifier = false;
13348 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
13349 if ((*j)->GetMiscValue() & damageSchoolMask)
13350 {
13351 ApplyPct(ignoreModifier, (*j)->GetAmount());
13352 addModifier = true;
13353 }
13354
13355 if (addModifier)
13356 TakenTotalMod += ignoreModifier;
13357 }
13358
13359 float tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod;
13360
13361 // bonus result can be negative
13362 return uint32(std::max(tmpDamage, 0.0f));
13363}
@ SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS
Definition: SpellInfo.h:197
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN
Definition: SpellAuraDefines.h:176
@ SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
Definition: SpellAuraDefines.h:150
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN
Definition: SpellAuraDefines.h:188
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT
Definition: SpellAuraDefines.h:189
@ SPELL_AURA_MOD_DAMAGE_TAKEN
Definition: SpellAuraDefines.h:77
@ SPELL_AURA_MOD_DAMAGE_FROM_CASTER
Definition: SpellAuraDefines.h:334
@ SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT
Definition: SpellAuraDefines.h:318
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT
Definition: SpellAuraDefines.h:177
float processDummyAuras(float TakenTotalMod) const
Definition: Unit.cpp:11888

References AddPct(), ApplyPct(), SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), GetTotalAuraModifier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::HasAttribute(), HasAuraType(), MECHANIC_BLEED, processDummyAuras(), RANGED_ATTACK, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_DAMAGE_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeSpellHitResult()

SpellMissInfo Unit::MeleeSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3155{
3156 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3157 // resist and deflect chances
3158 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3159 return SPELL_MISS_NONE;
3160
3161 WeaponAttackType attType = BASE_ATTACK;
3162
3163 // Check damage class instead of attack type to correctly handle judgements
3164 // - they are meele, but can't be dodged/parried/deflected because of ranged dmg class
3165 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED)
3166 attType = RANGED_ATTACK;
3167
3168 int32 attackerWeaponSkill;
3169 // skill value for these spells (for example judgements) is 5* level
3170 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED && !spellInfo->IsRangedWeaponSpell())
3171 attackerWeaponSkill = GetLevel() * 5;
3172 // bonus from skills is 0.04% per skill Diff
3173 else
3174 attackerWeaponSkill = int32(GetWeaponSkillValue(attType, victim));
3175
3176 int32 skillDiff = attackerWeaponSkill - int32(victim->GetMaxSkillValueForLevel(this));
3177
3178 uint32 roll = urand (0, 10000);
3179
3180 uint32 missChance = uint32(MeleeSpellMissChance(victim, attType, skillDiff, spellInfo->Id) * 100.0f);
3181 // Roll miss
3182 uint32 tmp = missChance;
3183 if (roll < tmp)
3184 return SPELL_MISS_MISS;
3185
3186 bool canDodge = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_DODGE);
3187 bool canParry = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_PARRY);
3188 bool canBlock = spellInfo->HasAttribute(SPELL_ATTR3_COMPLETELY_BLOCKED) && !spellInfo->HasAttribute(SPELL_ATTR0_CU_DIRECT_DAMAGE);
3189
3190 // Same spells cannot be parry/dodge
3191 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3192 return SPELL_MISS_NONE;
3193
3194 // Chance resist mechanic
3195 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3196 tmp += resist_chance;
3197 if (roll < tmp)
3198 return SPELL_MISS_RESIST;
3199
3200 // Ranged attacks can only miss, resist and deflect
3201 if (attType == RANGED_ATTACK)
3202 {
3203 // only if in front
3204 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION)))
3205 {
3206 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3207 tmp += deflect_chance;
3208 if (roll < tmp)
3209 return SPELL_MISS_DEFLECT;
3210 }
3211
3212 canDodge = false;
3213 canParry = false;
3214 }
3215
3216 // Check for attack from behind
3217 // xinef: if from behind or spell requires cast from behind
3218 if (!victim->HasInArc(M_PI, this))
3219 {
3221 {
3222 // Can`t dodge from behind in PvP (but its possible in PvE)
3223 if (victim->IsPlayer())
3224 {
3225 canDodge = false;
3226 }
3227
3228 // Can`t parry or block
3229 canParry = false;
3230 canBlock = false;
3231 }
3232 }
3233
3234 // Check creatures flags_extra for disable parry
3235 if (victim->IsCreature())
3236 {
3237 uint32 flagEx = victim->ToCreature()->GetCreatureTemplate()->flags_extra;
3238 // Xinef: no dodge flag
3239 if (flagEx & CREATURE_FLAG_EXTRA_NO_DODGE)
3240 canDodge = false;
3241 if (flagEx & CREATURE_FLAG_EXTRA_NO_PARRY)
3242 canParry = false;
3243 // Check creatures flags_extra for disable block
3244 if (flagEx & CREATURE_FLAG_EXTRA_NO_BLOCK)
3245 canBlock = false;
3246 }
3247 // Ignore combat result aura
3249 for (AuraEffectList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
3250 {
3251 if (!(*i)->IsAffectedOnSpell(spellInfo))
3252 continue;
3253 switch ((*i)->GetMiscValue())
3254 {
3255 case MELEE_HIT_DODGE:
3256 canDodge = false;
3257 break;
3258 case MELEE_HIT_BLOCK:
3259 canBlock = false;
3260 break;
3261 case MELEE_HIT_PARRY:
3262 canParry = false;
3263 break;
3264 default:
3265 LOG_DEBUG("entities.unit", "Spell {} SPELL_AURA_IGNORE_COMBAT_RESULT has unhandled state {}", (*i)->GetId(), (*i)->GetMiscValue());
3266 break;
3267 }
3268 }
3269
3270 if (canDodge)
3271 {
3272 // Roll dodge
3273 int32 dodgeChance = int32(victim->GetUnitDodgeChance() * 100.0f) - skillDiff * 4;
3274 // Reduce enemy dodge chance by SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
3276 dodgeChance = int32(float(dodgeChance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
3277 // Reduce dodge chance by attacker expertise rating
3278 if (IsPlayer())
3279 dodgeChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3280 else
3282
3283 // xinef: cant dodge while casting or while stunned
3284 if (dodgeChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3285 dodgeChance = 0;
3286
3287 tmp += dodgeChance;
3288 if (roll < tmp)
3289 return SPELL_MISS_DODGE;
3290 }
3291
3292 if (canParry)
3293 {
3294 // Roll parry
3295 int32 parryChance = int32(victim->GetUnitParryChance() * 100.0f) - skillDiff * 4;
3296 // Reduce parry chance by attacker expertise rating
3297 if (IsPlayer())
3298 parryChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3299 else
3301
3302 // xinef: cant parry while casting or while stunned
3303 if (parryChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3304 parryChance = 0;
3305
3306 tmp += parryChance;
3307 if (roll < tmp)
3308 return SPELL_MISS_PARRY;
3309 }
3310
3311 if (canBlock)
3312 {
3313 int32 blockChance = int32(victim->GetUnitBlockChance() * 100.0f) - skillDiff * 4;
3314
3315 // xinef: cant block while casting or while stunned
3316 if (blockChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3317 blockChance = 0;
3318
3319 tmp += blockChance;
3320 if (roll < tmp)
3321 return SPELL_MISS_BLOCK;
3322 }
3323
3324 return SPELL_MISS_NONE;
3325}
@ SPELL_ATTR0_CU_DIRECT_DAMAGE
Definition: SpellInfo.h:184
@ SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET
Definition: SpellInfo.h:193
@ SPELL_AURA_MOD_EXPERTISE
Definition: SpellAuraDefines.h:303
@ SPELL_AURA_IGNORE_COMBAT_RESULT
Definition: SpellAuraDefines.h:265
@ SPELL_AURA_MOD_ENEMY_DODGE
Definition: SpellAuraDefines.h:314
@ SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
Definition: SpellAuraDefines.h:311
@ CREATURE_FLAG_EXTRA_NO_PARRY
Definition: CreatureData.h:48
@ CREATURE_FLAG_EXTRA_NO_DODGE
Definition: CreatureData.h:69
@ SPELL_ATTR7_NO_ATTACK_PARRY
Definition: SharedDefines.h:665
@ SPELL_ATTR7_NO_ATTACK_DODGE
Definition: SharedDefines.h:664
@ SPELL_ATTR3_COMPLETELY_BLOCKED
Definition: SharedDefines.h:496
@ SPELL_MISS_PARRY
Definition: SharedDefines.h:1523
@ SPELL_MISS_DODGE
Definition: SharedDefines.h:1522
@ SPELL_MISS_BLOCK
Definition: SharedDefines.h:1524
float GetUnitDodgeChance() const
Definition: Unit.cpp:3640
float GetTotalAuraMultiplier(AuraType auratype) const
Definition: Unit.cpp:5924
float GetUnitParryChance() const
Definition: Unit.cpp:3657
float MeleeSpellMissChance(Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
Definition: Unit.cpp:18975

References BASE_ATTACK, CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, SpellInfo::DmgClass, CreatureTemplate::flags_extra, GetAuraEffectsByType(), Creature::GetCreatureTemplate(), GetLevel(), GetMaxSkillValueForLevel(), GetMechanicResistChance(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetUnitBlockChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), HasAuraType(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, Object::IsCreature(), IsNonMeleeSpellCast(), Object::IsPlayer(), SpellInfo::IsRangedWeaponSpell(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_DODGE, MELEE_HIT_PARRY, MeleeSpellMissChance(), RANGED_ATTACK, SPELL_ATTR0_CU_DIRECT_DAMAGE, SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET, SPELL_ATTR0_NO_ACTIVE_DEFENSE, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR3_COMPLETELY_BLOCKED, SPELL_ATTR7_NO_ATTACK_DODGE, SPELL_ATTR7_NO_ATTACK_PARRY, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_IGNORE_COMBAT_RESULT, SPELL_AURA_IGNORE_HIT_DIRECTION, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, SPELL_DAMAGE_CLASS_RANGED, SPELL_MISS_BLOCK, SPELL_MISS_DEFLECT, SPELL_MISS_DODGE, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_PARRY, SPELL_MISS_RESIST, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, UNIT_STATE_STUNNED, urand(), and VICTIMSTATE_DODGE.

Referenced by SpellHitResult().

◆ MeleeSpellMissChance()

float Unit::MeleeSpellMissChance ( Unit const *  victim,
WeaponAttackType  attType,
int32  skillDiff,
uint32  spellId 
) const
18976{
18977 SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;
18978 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
18979 {
18980 return 0.0f;
18981 }
18982
18983 //calculate miss chance
18984 float missChance = victim->GetUnitMissChance(attType);
18985
18986 // Check if dual wielding, add additional miss penalty - when mainhand has on next swing spell, offhand doesnt suffer penalty
18987 if (!spellId && (attType != RANGED_ATTACK) && HasOffhandWeaponForAttack() && (!m_currentSpells[CURRENT_MELEE_SPELL] || !m_currentSpells[CURRENT_MELEE_SPELL]->IsNextMeleeSwingSpell()))
18988 {
18989 missChance += 19;
18990 }
18991
18992 // bonus from skills is 0.04%
18993 //miss_chance -= skillDiff * 0.04f;
18994 int32 diff = -skillDiff;
18995 if (victim->IsPlayer())
18996 missChance += diff > 0 ? diff * 0.04f : diff * 0.02f;
18997 else
18998 missChance += diff > 10 ? 1 + (diff - 10) * 0.4f : diff * 0.1f;
18999
19000 // Calculate hit chance
19001 float hitChance = 100.0f;
19002
19003 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
19004 if (spellId)
19005 {
19006 if (Player* modOwner = GetSpellModOwner())
19007 modOwner->ApplySpellMod(spellId, SPELLMOD_RESIST_MISS_CHANCE, hitChance);
19008 }
19009
19010 missChance -= hitChance - 100.0f;
19011
19012 if (attType == RANGED_ATTACK)
19013 missChance -= m_modRangedHitChance;
19014 else
19015 missChance -= m_modMeleeHitChance;
19016
19017 // Limit miss chance from 0 to 60%
19018 if (missChance < 0.0f)
19019 return 0.0f;
19020 if (missChance > 60.0f)
19021 return 60.0f;
19022 return missChance;
19023}

References CURRENT_MELEE_SPELL, GetSpellModOwner(), GetUnitMissChance(), SpellInfo::HasAttribute(), HasOffhandWeaponForAttack(), Object::IsPlayer(), m_currentSpells, m_modMeleeHitChance, m_modRangedHitChance, RANGED_ATTACK, SPELL_ATTR7_NO_ATTACK_MISS, SPELLMOD_RESIST_MISS_CHANCE, and sSpellMgr.

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ ModifyAuraState()

void Unit::ModifyAuraState ( AuraStateType  flag,
bool  apply 
)
10489{
10490 if (apply)
10491 {
10492 if (!HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10493 {
10494 SetFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10495 Unit::AuraMap& tAuras = GetOwnedAuras();
10496 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10497 {
10498 if ((*itr).second->IsRemoved())
10499 continue;
10500
10501 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10502 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10503 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, true);
10504 }
10505 }
10506 }
10507 else
10508 {
10509 if (HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10510 {
10511 RemoveFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10512
10513 if (flag != AURA_STATE_ENRAGE) // enrage aura state triggering continues auras
10514 {
10515 Unit::AuraMap& tAuras = GetOwnedAuras();
10516 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10517 {
10518 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10519 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10520 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, false);
10521 }
10522 }
10523 }
10524 }
10525}
@ AURA_EFFECT_HANDLE_REAL
Definition: SpellAuraDefines.h:42
@ AURA_STATE_ENRAGE
Definition: SharedDefines.h:1309
void SetFlag(uint16 index, uint32 newFlag)
Definition: Object.cpp:845
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition: Object.cpp:860
std::multimap< uint32, Aura * > AuraMap
Definition: Unit.h:635
AuraMap & GetOwnedAuras()
Definition: Unit.h:1321

References AURA_EFFECT_HANDLE_REAL, AURA_STATE_ENRAGE, Object::GetGUID(), GetOwnedAuras(), Object::HasFlag(), Object::RemoveFlag(), Object::SetFlag(), and UNIT_FIELD_AURASTATE.

Referenced by _ApplyAura(), _UnapplyAura(), ClearAllReactives(), Spell::finish(), debug_commandscript::HandleDebugSetAuraStateCommand(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), ProcDamageAndSpellFor(), Update(), and UpdateReactives().

◆ ModifyHealth()

int32 Unit::ModifyHealth ( int32  val)
14078{
14079 int32 gain = 0;
14080
14081 if (dVal == 0)
14082 return 0;
14083
14084 int32 curHealth = (int32)GetHealth();
14085
14086 int32 val = dVal + curHealth;
14087 if (val <= 0)
14088 {
14089 SetHealth(0);
14090 return -curHealth;
14091 }
14092
14093 int32 maxHealth = (int32)GetMaxHealth();
14094
14095 if (val < maxHealth)
14096 {
14097 SetHealth(val);
14098 gain = val - curHealth;
14099 }
14100 else if (curHealth != maxHealth)
14101 {
14102 SetHealth(maxHealth);
14103 gain = maxHealth - curHealth;
14104 }
14105
14106 return gain;
14107}

References GetHealth(), GetMaxHealth(), and SetHealth().

Referenced by DealDamage(), DealHeal(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::RegenerateHealth(), Player::RegenerateHealth(), npc_injured_patient::npc_injured_patientAI::Reset(), Spell::TakePower(), Aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ ModifyPower()

int32 Unit::ModifyPower ( Powers  power,
int32  val,
bool  withPowerUpdate = true 
)
14136{
14137 if (dVal == 0)
14138 return 0;
14139
14140 int32 gain = 0;
14141
14142 int32 curPower = (int32)GetPower(power);
14143
14144 int32 val = dVal + curPower;
14145 if (val <= 0)
14146 {
14147 SetPower(power, 0, withPowerUpdate);
14148 return -curPower;
14149 }
14150
14151 int32 maxPower = (int32)GetMaxPower(power);
14152
14153 if (val < maxPower)
14154 {
14155 SetPower(power, val, withPowerUpdate);
14156 gain = val - curPower;
14157 }
14158 else if (curPower != maxPower)
14159 {
14160 SetPower(power, maxPower, withPowerUpdate);
14161 gain = maxPower - curPower;
14162 }
14163
14164 if (GetAI())
14165 {
14166 GetAI()->OnPowerUpdate(power, gain, dVal, curPower);
14167 }
14168
14169 return gain;
14170}
virtual void OnPowerUpdate(Powers, int32, int32, uint32)
Called when the creature power updates.
Definition: UnitAI.h:375
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition: Unit.cpp:15552

References GetAI(), GetMaxPower(), GetPower(), UnitAI::OnPowerUpdate(), and SetPower().

Referenced by CalcAbsorbResist(), spell_igb_cannon_blast::CalculatePower(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), EnergizeBySpell(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_kelthuzad_detonate_mana_aura::HandleScript(), boss_pathaleon_the_calculator::JustEngagedWith(), boss_curator::JustEngagedWith(), Pet::LoseHappiness(), ModifyPowerPct(), Creature::Regenerate(), RewardRage(), Pet::setDeathState(), Spell::TakePower(), Spell::TakeRunePower(), Aura::Update(), and boss_faction_championsAI::UpdateAI().

◆ ModifyPowerPct()

int32 Unit::ModifyPowerPct ( Powers  power,
float  pct,
bool  apply = true 
)
14174{
14175 float amount = (float)GetMaxPower(power);
14176 ApplyPercentModFloatVar(amount, pct, apply);
14177
14178 return ModifyPower(power, (int32)amount - (int32)GetMaxPower(power));
14179}

References ApplyPercentModFloatVar(), GetMaxPower(), and ModifyPower().

Referenced by AuraEffect::HandleAuraModIncreaseEnergyPercent().

◆ ModifyRedirectThreat()

void Unit::ModifyRedirectThreat ( int32  amount)
inline
void ModifyThreatPct(int32 amount)
Definition: ThreatMgr.h:308

References _redirectThreatInfo, and RedirectThreatInfo::ModifyThreatPct().

Referenced by spell_warr_vigilance::HandleAfterApply().

◆ ModSpellCastTime()

void Unit::ModSpellCastTime ( SpellInfo const *  spellProto,
int32 castTime,
Spell spell = nullptr 
)
Todo:
:(MadAgos) Eventually check and delete the bool argument
14960{
14961 if (!spellInfo || castTime < 0)
14962 return;
14963
14964 if (spellInfo->IsChanneled() && spellInfo->HasAura(SPELL_AURA_MOUNTED))
14965 return;
14966
14967 // called from caster
14968 if (Player* modOwner = GetSpellModOwner())
14970 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell, bool(modOwner != this && !IsPet()));
14971
14972 switch (spellInfo->DmgClass)
14973 {
14975 if (spellInfo->AttributesEx5 & SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC) // required double check
14976 castTime = int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
14977 else if (spellInfo->SpellVisual[0] == 3881 && HasAura(67556)) // cooking with Chef Hat.
14978 castTime = 500;
14979 break;
14981 break; // no known cases
14983 castTime = CanInstantCast() ? 0 : int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
14984 break;
14986 castTime = int32(float(castTime) * m_modAttackSpeedPct[RANGED_ATTACK]);
14987 break;
14988 default:
14989 break;
14990 }
14991}
@ SPELLMOD_CASTING_TIME
Definition: SpellDefines.h:86
@ SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC
Definition: SharedDefines.h:580
bool CanInstantCast() const
Definition: Unit.h:1760

References SpellInfo::AttributesEx5, CanInstantCast(), SpellInfo::DmgClass, Object::GetFloatValue(), GetSpellModOwner(), SpellInfo::HasAura(), HasAura(), SpellInfo::Id, SpellInfo::IsChanneled(), IsPet(), m_modAttackSpeedPct, RANGED_ATTACK, SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC, SPELL_AURA_MOUNTED, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLMOD_CASTING_TIME, SpellInfo::SpellVisual, and UNIT_MOD_CAST_SPEED.

Referenced by SpellInfo::CalcCastTime().

◆ ModSpellDuration()

int32 Unit::ModSpellDuration ( SpellInfo const *  spellProto,
Unit const *  target,
int32  duration,
bool  positive,
uint32  effectMask 
)
14860{
14861 // don't mod permanent auras duration
14862 if (duration < 0)
14863 return duration;
14864
14865 // some auras are not affected by duration modifiers
14866 if (spellProto->HasAttribute(SPELL_ATTR7_NO_TARGET_DURATION_MOD))
14867 return duration;
14868
14869 // cut duration only of negative effects
14870 // xinef: also calculate self casts, spell can be reflected for example
14871 if (!positive)
14872 {
14873 int32 mechanic = spellProto->GetSpellMechanicMaskByEffectMask(effectMask);
14874
14875 int32 durationMod;
14876 int32 durationMod_always = 0;
14877 int32 durationMod_not_stack = 0;
14878
14879 for (uint8 i = 1; i <= MECHANIC_ENRAGED; ++i)
14880 {
14881 if (!(mechanic & 1 << i))
14882 continue;
14883
14884 // Xinef: spells affecting movement imparing effects should not reduce duration if disoriented mechanic is present
14885 if (i == MECHANIC_SNARE && (mechanic & (1 << MECHANIC_DISORIENTED)))
14886 continue;
14887
14888 // Find total mod value (negative bonus)
14889 int32 new_durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD, i);
14890 // Find max mod (negative bonus)
14891 int32 new_durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, i);
14892 // Check if mods applied before were weaker
14893 if (new_durationMod_always < durationMod_always)
14894 durationMod_always = new_durationMod_always;
14895 if (new_durationMod_not_stack < durationMod_not_stack)
14896 durationMod_not_stack = new_durationMod_not_stack;
14897 }
14898
14899 // Select strongest negative mod
14900 if (durationMod_always > durationMod_not_stack)
14901 durationMod = durationMod_not_stack;
14902 else
14903 durationMod = durationMod_always;
14904
14905 if (durationMod != 0)
14906 AddPct(duration, durationMod);
14907
14908 // there are only negative mods currently
14909 durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, spellProto->Dispel);
14910 durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, spellProto->Dispel);
14911
14912 durationMod = 0;
14913 if (durationMod_always > durationMod_not_stack)
14914 durationMod += durationMod_not_stack;
14915 else
14916 durationMod += durationMod_always;
14917
14918 if (durationMod != 0)
14919 AddPct(duration, durationMod);
14920 }
14921 else
14922 {
14923 // else positive mods here, there are no currently
14924 // when there will be, change GetTotalAuraModifierByMiscValue to GetTotalPositiveAuraModifierByMiscValue
14925 }
14926
14927 // Glyphs which increase duration of selfcasted buffs
14928 if (target == this)
14929 {
14930 switch (spellProto->SpellFamilyName)
14931 {
14932 case SPELLFAMILY_DRUID:
14933 if (spellProto->SpellFamilyFlags[0] & 0x100)
14934 {
14935 // Glyph of Thorns
14936 if (AuraEffect* aurEff = GetAuraEffect(57862, 0))
14937 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
14938 }
14939 break;
14941 if ((spellProto->SpellFamilyFlags[0] & 0x00000002) && spellProto->SpellIconID == 298)
14942 {
14943 // Glyph of Blessing of Might
14944 if (AuraEffect* aurEff = GetAuraEffect(57958, 0))
14945 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
14946 }
14947 else if ((spellProto->SpellFamilyFlags[0] & 0x00010000) && spellProto->SpellIconID == 306)
14948 {
14949 // Glyph of Blessing of Wisdom
14950 if (AuraEffect* aurEff = GetAuraEffect(57979, 0))
14951 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
14952 }
14953 break;
14954 }
14955 }
14956 return std::max(duration, 0);
14957}
constexpr auto MINUTE
Definition: Common.h:47
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK
Definition: SpellAuraDefines.h:309
@ SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK
Definition: SpellAuraDefines.h:297
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL
Definition: SpellAuraDefines.h:308
@ SPELL_AURA_MECHANIC_DURATION_MOD
Definition: SpellAuraDefines.h:295
@ SPELL_ATTR7_NO_TARGET_DURATION_MOD
Definition: SharedDefines.h:642
@ MECHANIC_ENRAGED
Definition: SharedDefines.h:1356
@ MECHANIC_DISORIENTED
Definition: SharedDefines.h:1327

References AddPct(), SpellInfo::Dispel, GetAuraEffect(), GetMaxNegativeAuraModifierByMiscValue(), SpellInfo::GetSpellMechanicMaskByEffectMask(), GetTotalAuraModifierByMiscValue(), SpellInfo::HasAttribute(), IN_MILLISECONDS, MECHANIC_DISORIENTED, MECHANIC_ENRAGED, MECHANIC_SNARE, MINUTE, SPELL_ATTR7_NO_TARGET_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, SPELLFAMILY_DRUID, SPELLFAMILY_PALADIN, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

Referenced by Spell::DoSpellHitOnUnit(), and Spell::EffectInterruptCast().

◆ MonsterMoveWithSpeed()

◆ Mount()

void Unit::Mount ( uint32  mount,
uint32  vehicleId = 0,
uint32  creatureEntry = 0 
)
13452{
13453 if (mount)
13455
13457
13458 if (Player* player = ToPlayer())
13459 {
13460 sScriptMgr->AnticheatSetUnderACKmount(player);
13461
13462 // mount as a vehicle
13463 if (VehicleId)
13464 {
13465 if (CreateVehicleKit(VehicleId, creatureEntry))
13466 {
13467 GetVehicleKit()->Reset();
13468
13469 // Send others that we now have a vehicle
13471 data << GetPackGUID();
13472 data << uint32(VehicleId);
13473 SendMessageToSet(&data, true);
13474
13476 player->GetSession()->SendPacket(&data);
13477
13478 // mounts can also have accessories
13480 }
13481 }
13482
13483 // unsummon pet
13484 Pet* pet = player->GetPet();
13485 if (pet)
13486 {
13488 // don't unsummon pet in arena but SetFlag UNIT_FLAG_STUNNED to disable pet's interface
13489 if (bg && bg->isArena())
13491 else
13492 player->UnsummonPetTemporaryIfAny();
13493 }
13494
13495 // xinef: if we have charmed npc, stun him also
13496 if (Unit* charm = player->GetCharm())
13497 if (charm->IsCreature())
13498 charm->SetUnitFlag(UNIT_FLAG_STUNNED);
13499
13500 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13501 data << GetPackGUID();
13502 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13503 data << player->GetCollisionHeight();
13504 player->GetSession()->SendPacket(&data);
13505 }
13506
13508}
@ AURA_INTERRUPT_FLAG_MOUNT
Definition: SpellDefines.h:60
bool isArena() const
Definition: Battleground.h:413
bool CreateVehicleKit(uint32 id, uint32 creatureEntry)
Definition: Unit.cpp:18702
void Reset(bool evading=false)
Definition: Vehicle.cpp:119
void InstallAllAccessories(bool evading)
Definition: Vehicle.cpp:86

References AURA_INTERRUPT_FLAG_MOUNT, CreateVehicleKit(), Player::GetBattleground(), GetCharm(), GameTime::GetGameTime(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), Vehicle::InstallAllAccessories(), Battleground::isArena(), RemoveAurasWithInterruptFlags(), Vehicle::Reset(), WorldObject::SendMessageToSet(), SetUInt32Value(), SetUnitFlag(), SMSG_MOVE_SET_COLLISION_HGT, SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, and UNIT_FLAG_STUNNED.

Referenced by AuraEffect::HandleAuraMounted(), spell_mount_check_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyMountCommand(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::JustRespawned(), Creature::LoadCreaturesAddon(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), npc_scarlet_courier::npc_scarlet_courierAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), WorldSession::SendDoFlight(), and npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached().

◆ NearTeleportTo() [1/2]

void Unit::NearTeleportTo ( float  x,
float  y,
float  z,
float  orientation,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19972{
19973 DisableSpline();
19974 if (IsPlayer())
19975 ToPlayer()->TeleportTo(GetMapId(), x, y, z, orientation, TELE_TO_NOT_LEAVE_COMBAT | (removeTransport ? 0 : TELE_TO_NOT_LEAVE_TRANSPORT) | TELE_TO_NOT_UNSUMMON_PET | (casting ? TELE_TO_SPELL : 0) | (vehicleTeleport ? TELE_TO_NOT_LEAVE_VEHICLE : 0) | (withPet ? TELE_TO_WITH_PET : 0));
19976 else
19977 {
19978 Position pos = {x, y, z, orientation};
19979 SendTeleportPacket(pos);
19980 UpdatePosition(x, y, z, orientation, true);
19983 }
19984}
@ TELE_TO_WITH_PET
Definition: Player.h:827
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition: Player.h:826
@ TELE_TO_SPELL
Definition: Player.h:825
@ TELE_TO_NOT_LEAVE_COMBAT
Definition: Player.h:823
@ TELE_TO_NOT_UNSUMMON_PET
Definition: Player.h:824
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition: Player.h:822
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition: Player.cpp:1330
void SendTeleportPacket(Position &pos)
Definition: Unit.cpp:19993
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition: Unit.cpp:19117
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition: Unit.cpp:20012
void ReinitializeMovement()
Definition: MotionMaster.cpp:904

References DisableSpline(), WorldLocation::GetMapId(), GetMotionMaster(), Object::IsPlayer(), MotionMaster::ReinitializeMovement(), SendTeleportPacket(), TELE_TO_NOT_LEAVE_COMBAT, TELE_TO_NOT_LEAVE_TRANSPORT, TELE_TO_NOT_LEAVE_VEHICLE, TELE_TO_NOT_UNSUMMON_PET, TELE_TO_SPELL, TELE_TO_WITH_PET, Player::TeleportTo(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdatePosition().

◆ NearTeleportTo() [2/2]

void Unit::NearTeleportTo ( Position pos,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19967{
19968 NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), casting, vehicleTeleport, withPet, removeTransport);
19969}
void NearTeleportTo(Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
Definition: Unit.cpp:19966

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and NearTeleportTo().

Referenced by boss_viscidus::DamageTaken(), npc_madrigosa::npc_madrigosaAI::DoAction(), npc_akama_illidan::DoAction(), Spell::EffectLeap(), Spell::EffectResurrectPet(), Spell::EffectStuck(), Spell::EffectSummonPet(), Spell::EffectTeleportUnits(), Spell::EffectTeleUnitsFaceCaster(), npc_giant_claw_tentacle::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnterEvadeMode(), boss_zuljin::boss_zuljinAI::EnterPhase(), UtherBatteredHiltEvent::Execute(), BattlegroundBE::HandleAreaTrigger(), BattlegroundDS::HandleAreaTrigger(), BattlegroundNA::HandleAreaTrigger(), BattlegroundRL::HandleAreaTrigger(), BattlegroundRV::HandleAreaTrigger(), spell_moroes_vanish::HandleDummy(), spell_class_call_handler::HandleOnHitRogue(), npc_echo_of_medivh::HandlePieceJustDied(), BattlegroundBE::HandlePlayerUnderMap(), BattlegroundDS::HandlePlayerUnderMap(), BattlegroundNA::HandlePlayerUnderMap(), BattlegroundRL::HandlePlayerUnderMap(), BattlegroundRV::HandlePlayerUnderMap(), npc_pet_mage_mirror_image::InitializeAI(), boss_urom::boss_uromAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_grandmaster_vorpil::JustEngagedWith(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), NearTeleportTo(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_chesspiece::OnCharmed(), npc_vh_sinclari::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), boss_gothik::boss_gothikAI::Reset(), Map::ScriptsProcess(), npc_midsummer_torch_target::SelectPosition(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), boss_urom::boss_uromAI::SpellHit(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), npc_pos_leader_second::npc_pos_leader_secondAI::SpellHitTarget(), boss_cyanigosa::boss_cyanigosaAI::SpellHitTarget(), BattlegroundRV::TeleportUnitToNewZ(), Vehicle::TeleportVehicle(), npc_doomfire_spirit::TryTeleportInDirection(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_magus_telestra::boss_magus_telestraAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), and npc_minigob_manabonk::UpdateAI().

◆ OutDebugInfo()

void Unit::OutDebugInfo ( ) const
20222{
20223 LOG_ERROR("entities.unit", "Unit::OutDebugInfo");
20224 LOG_INFO("entities.unit", "GUID {}, name {}", GetGUID().ToString(), GetName());
20225 LOG_INFO("entities.unit", "OwnerGUID {}, MinionGUID {}, CharmerGUID {}, CharmedGUID {}",
20227 LOG_INFO("entities.unit", "In world {}, unit type mask {}", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask);
20228 if (IsInWorld())
20229 LOG_INFO("entities.unit", "Mapid {}", GetMapId());
20230
20231 LOG_INFO("entities.unit", "Summon Slot: ");
20232 for (uint32 i = 0; i < MAX_SUMMON_SLOT; ++i)
20233 LOG_INFO("entities.unit", "{}, ", m_SummonSlot[i].ToString());
20234 LOG_INFO("server.loading", " ");
20235
20236 LOG_INFO("entities.unit", "Controlled List: ");
20237 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20238 LOG_INFO("entities.unit", "{}, ", (*itr)->GetGUID().ToString());
20239 LOG_INFO("server.loading", " ");
20240
20241 LOG_INFO("entities.unit", "Aura List: ");
20242 for (AuraApplicationMap::const_iterator itr = m_appliedAuras.begin(); itr != m_appliedAuras.end(); ++itr)
20243 LOG_INFO("entities.unit", "{}, ", itr->first);
20244 LOG_INFO("server.loading", " ");
20245
20246 if (IsVehicle())
20247 {
20248 LOG_INFO("entities.unit", "Passenger List: ");
20249 for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr)
20250 if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger.Guid))
20251 LOG_INFO("entities.unit", "{}, ", passenger->GetGUID().ToString());
20252 LOG_INFO("server.loading", " ");
20253 }
20254
20255 if (GetVehicle())
20256 LOG_INFO("entities.unit", "On vehicle {}.", GetVehicleBase()->GetEntry());
20257}
Seats
Definition: boss_flame_leviathan.cpp:167

References GetCharmerGUID(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), WorldLocation::GetMapId(), GetMinionGUID(), WorldObject::GetName(), GetOwnerGUID(), ObjectAccessor::GetUnit(), GetVehicle(), GetVehicleBase(), GetVehicleKit(), Object::IsInWorld(), IsVehicle(), LOG_ERROR, LOG_INFO, m_appliedAuras, m_Controlled, m_SummonSlot, m_unitTypeMask, MAX_SUMMON_SLOT, and Position::ToString().

Referenced by SetMinion().

◆ PatchValuesUpdate()

void Unit::PatchValuesUpdate ( ByteBuffer valuesUpdateBuf,
BuildValuesCachePosPointers posPointers,
Player target 
)
private
20834{
20835 Creature const* creature = ToCreature();
20836
20837 // UNIT_NPC_FLAGS
20838 if (creature && posPointers.UnitNPCFlagsPos >= 0)
20839 {
20840 uint32 appendValue = m_uint32Values[UNIT_NPC_FLAGS];
20841
20842 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && appendValue & UNIT_NPC_FLAG_FLIGHTMASTER)
20843 appendValue |= UNIT_NPC_FLAG_GOSSIP; // flight masters need NPC gossip flag to show instant flight toggle option
20844
20845 if (!target->CanSeeSpellClickOn(creature))
20846 appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;
20847
20848 if (!target->CanSeeVendor(creature))
20849 appendValue &= ~UNIT_NPC_FLAG_VENDOR_MASK;
20850
20851 if (!creature->IsValidTrainerForPlayer(target, &appendValue))
20852 appendValue &= ~UNIT_NPC_FLAG_TRAINER;
20853
20854 valuesUpdateBuf.put(posPointers.UnitNPCFlagsPos, appendValue);
20855 }
20856
20857 // UNIT_FIELD_AURASTATE
20858 if (posPointers.UnitFieldAuraStatePos >= 0)
20859 valuesUpdateBuf.put(posPointers.UnitFieldAuraStatePos, uint32(BuildAuraStateUpdateForTarget(target)));
20860
20861 // UNIT_FIELD_FLAGS
20862 if (posPointers.UnitFieldFlagsPos >= 0)
20863 {
20864 uint32 appendValue = m_uint32Values[UNIT_FIELD_FLAGS];
20865 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20866 appendValue &= ~UNIT_FLAG_NOT_SELECTABLE;
20867
20868 valuesUpdateBuf.put(posPointers.UnitFieldFlagsPos, appendValue);
20869 }
20870
20871 // UNIT_FIELD_DISPLAYID
20872 // Use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures.
20873 if (posPointers.UnitFieldDisplayPos >= 0)
20874 {
20876 if (creature)
20877 {
20878 CreatureTemplate const* cinfo = creature->GetCreatureTemplate();
20879
20880 // this also applies for transform auras
20881 if (SpellInfo const* transform = sSpellMgr->GetSpellInfo(getTransForm()))
20882 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
20883 if (transform->Effects[i].IsAura(SPELL_AURA_TRANSFORM))
20884 if (CreatureTemplate const* transformInfo = sObjectMgr->GetCreatureTemplate(transform->Effects[i].MiscValue))
20885 {
20886 cinfo = transformInfo;
20887 break;
20888 }
20889
20891 {
20892 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20893 {
20894 displayId = cinfo->GetFirstVisibleModel()->CreatureDisplayID;
20895 }
20896 else
20897 {
20898 displayId = cinfo->GetFirstInvisibleModel()->CreatureDisplayID;
20899 }
20900 }
20901 }
20902
20903 valuesUpdateBuf.put(posPointers.UnitFieldDisplayPos, uint32(displayId));
20904 }
20905
20906 // UNIT_DYNAMIC_FLAGS
20907 // Hide lootable animation for unallowed players.
20908 if (posPointers.UnitDynamicFlagsPos >= 0)
20909 {
20911
20912 if (creature)
20913 {
20914 if (creature->hasLootRecipient())
20915 {
20916 dynamicFlags |= UNIT_DYNFLAG_TAPPED;
20917 if (creature->isTappedBy(target))
20918 dynamicFlags |= UNIT_DYNFLAG_TAPPED_BY_PLAYER;
20919 }
20920
20921 if (!target->isAllowedToLoot(creature))
20922 dynamicFlags &= ~UNIT_DYNFLAG_LOOTABLE;
20923 }
20924
20925 // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras
20926 if (dynamicFlags & UNIT_DYNFLAG_TRACK_UNIT)
20928 dynamicFlags &= ~UNIT_DYNFLAG_TRACK_UNIT;
20929
20930 valuesUpdateBuf.put(posPointers.UnitDynamicFlagsPos, dynamicFlags);
20931 }
20932
20933 // UNIT_FIELD_BYTES_2
20934 if (posPointers.UnitFieldBytes2Pos >= 0)
20935 {
20936 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20937 {
20939 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
20940 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
20941 // Allow targetting opposite faction in party when enabled in config
20942 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8))); // this flag is at uint8 offset 1 !!
20943 }// pussywizard / Callmephil
20944 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
20945 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
20946 {
20947 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & 0xFFFFF2FF)); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY
20948 }
20949 }
20950
20951 // UNIT_FIELD_FACTIONTEMPLATE
20952 if (posPointers.UnitFieldFactionTemplatePos >= 0)
20953 {
20954 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20955 {
20957 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
20958 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
20959 // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)
20960 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20961 }// pussywizard / Callmephil
20962 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
20963 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
20964 {
20965 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20966 }
20967 }
20968
20969 sScriptMgr->OnPatchValuesUpdate(this, valuesUpdateBuf, posPointers, target);
20970}
@ CONFIG_INSTANT_TAXI
Definition: IWorld.h:382
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition: IWorld.h:75
@ CREATURE_FLAG_EXTRA_TRIGGER
Definition: CreatureData.h:53
@ UNIT_DYNFLAG_TRACK_UNIT
Definition: SharedDefines.h:3122
bool IsValidTrainerForPlayer(Player *player, uint32 *npcFlags=nullptr) const
Definition: Creature.cpp:1264
bool isTappedBy(Player const *player) const
Definition: Creature.cpp:1380
uint32 CreatureDisplayID
Definition: CreatureData.h:180
CreatureModel const * GetFirstInvisibleModel() const
Definition: Creature.cpp:162
CreatureModel const * GetFirstVisibleModel() const
Definition: Creature.cpp:172
bool isAllowedToLoot(Creature const *creature)
Definition: PlayerStorage.cpp:5622
bool CanSeeVendor(Creature const *creature) const
Definition: Player.cpp:14304
bool IsSpectator() const
Definition: Player.h:2558
bool CanSeeSpellClickOn(Creature const *creature) const
Definition: Player.cpp:14281
uint32 BuildAuraStateUpdateForTarget(Unit *target) const
Definition: Unit.cpp:10527
int32 UnitFieldFlagsPos
Definition: UnitUtils.h:99
int32 UnitFieldDisplayPos
Definition: UnitUtils.h:100
int32 UnitDynamicFlagsPos
Definition: UnitUtils.h:101
int32 UnitFieldAuraStatePos
Definition: UnitUtils.h:98
int32 UnitFieldFactionTemplatePos
Definition: UnitUtils.h:103
int32 UnitFieldBytes2Pos
Definition: UnitUtils.h:102
int32 UnitNPCFlagsPos
Definition: UnitUtils.h:97
bool IsGMAccount() const
Definition: WorldSession.cpp:181
void put(std::size_t pos, T value)
Definition: ByteBuffer.h:137

References BuildAuraStateUpdateForTarget(), Player::CanSeeSpellClickOn(), Player::CanSeeVendor(), CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP, CONFIG_INSTANT_TAXI, CREATURE_FLAG_EXTRA_TRIGGER, CreatureModel::CreatureDisplayID, WorldObject::FindMap(), CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), GetFaction(), GetFactionTemplateEntry(), CreatureTemplate::GetFirstInvisibleModel(), CreatureTemplate::GetFirstVisibleModel(), Object::GetGUID(), Player::GetSession(), getTransForm(), HasAuraTypeWithCaster(), Creature::hasLootRecipient(), Player::isAllowedToLoot(), Map::IsBattleArena(), IsControlledByPlayer(), FactionTemplateEntry::IsFriendlyTo(), Player::IsGameMaster(), WorldSession::IsGMAccount(), IsInRaidWith(), Player::IsSpectator(), Creature::isTappedBy(), Creature::IsValidTrainerForPlayer(), Object::m_uint32Values, MAX_SPELL_EFFECTS, ByteBuffer::put(), sObjectMgr, SPELL_AURA_MOD_STALKED, SPELL_AURA_TRANSFORM, sScriptMgr, sSpellMgr, sWorld, Object::ToCreature(), UNIT_BYTE2_FLAG_SANCTUARY, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_DYNFLAG_TRACK_UNIT, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FLAGS, UNIT_NPC_FLAG_FLIGHTMASTER, UNIT_NPC_FLAG_GOSSIP, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, and BuildValuesCachePosPointers::UnitNPCFlagsPos.

Referenced by BuildValuesUpdate().

◆ PauseMovement()

void Unit::PauseMovement ( uint32  timer = 0,
uint8  slot = 0 
)
virtual

Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.

16657{
16658 if (slot >= MAX_MOTION_SLOT)
16659 return;
16660
16661 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16662 movementGenerator->Pause(timer);
16663
16664 StopMoving();
16665}
@ MAX_MOTION_SLOT
Definition: MotionMaster.h:64
void StopMoving()
Definition: Unit.cpp:16637
Definition: MovementGenerator.h:28

References GetMotionMaster(), MAX_MOTION_SLOT, and StopMoving().

Referenced by WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::SendListInventory(), and boss_shade_of_aran::SetGUID().

◆ PetSpellFail()

void Unit::PetSpellFail ( SpellInfo const *  spellInfo,
Unit target,
uint32  result 
)
20332{
20333 CharmInfo* charmInfo = GetCharmInfo();
20334 if (!charmInfo || !IsCreature())
20335 return;
20336
20338 {
20339 if ((result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE) || !ToCreature()->HasReactState(REACT_PASSIVE))
20340 if (Unit* owner = GetOwner())
20341 {
20342 if (spellInfo->IsPositive() && IsFriendlyTo(target))
20343 {
20344 AttackStop();
20345 charmInfo->SetIsAtStay(false);
20346 charmInfo->SetIsCommandAttack(true);
20347 charmInfo->SetIsReturning(false);
20348 charmInfo->SetIsFollowing(false);
20349
20350 GetMotionMaster()->MoveFollow(target, PET_FOLLOW_DIST, rand_norm() * 2 * M_PI);
20351 }
20352 else if (owner->IsValidAttackTarget(target))
20353 {
20354 AttackStop();
20355 charmInfo->SetIsAtStay(false);
20356 charmInfo->SetIsCommandAttack(true);
20357 charmInfo->SetIsReturning(false);
20358 charmInfo->SetIsFollowing(false);
20359
20360 if (!ToCreature()->HasReactState(REACT_PASSIVE))
20361 ToCreature()->AI()->AttackStart(target);
20362 else
20363 GetMotionMaster()->MoveChase(target);
20364 }
20365 }
20366
20367 // can be extended in future
20368 if (result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE)
20369 {
20370 charmInfo->SetForcedSpell(spellInfo->IsPositive() ? -int32(spellInfo->Id) : spellInfo->Id);
20371 charmInfo->SetForcedTargetGUID(target->GetGUID());
20372 }
20373 else
20374 {
20375 charmInfo->SetForcedSpell(0);
20377 }
20378 }
20379}
#define PET_FOLLOW_DIST
Definition: PetDefines.h:198
@ SPELL_FAILED_OUT_OF_RANGE
Definition: SharedDefines.h:1046
@ SPELL_FAILED_LINE_OF_SIGHT
Definition: SharedDefines.h:996
bool IsPathfindingEnabled(const Map *map)
Definition: DisableMgr.cpp:411
virtual void AttackStart(Unit *)
Definition: UnitAI.cpp:27
void SetIsAtStay(bool val)
Definition: CharmInfo.cpp:365
void SetIsFollowing(bool val)
Definition: CharmInfo.cpp:375
void SetIsReturning(bool val)
Definition: CharmInfo.cpp:385
void SetForcedSpell(uint32 id)
Definition: CharmInfo.h:175
void SetForcedTargetGUID(ObjectGuid guid=ObjectGuid::Empty)
Definition: CharmInfo.h:177
void SetIsCommandAttack(bool val)
Definition: CharmInfo.cpp:303
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:313
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true)
The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:409

References Creature::AI(), UnitAI::AttackStart(), AttackStop(), ObjectGuid::Empty, GetCharmInfo(), Object::GetGUID(), WorldObject::GetMap(), GetMotionMaster(), GetOwner(), SpellInfo::Id, Object::IsCreature(), IsFriendlyTo(), DisableMgr::IsPathfindingEnabled(), SpellInfo::IsPositive(), MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_DIST, rand_norm(), REACT_PASSIVE, CharmInfo::SetForcedSpell(), CharmInfo::SetForcedTargetGUID(), CharmInfo::SetIsAtStay(), CharmInfo::SetIsCommandAttack(), CharmInfo::SetIsFollowing(), CharmInfo::SetIsReturning(), SPELL_FAILED_LINE_OF_SIGHT, SPELL_FAILED_OUT_OF_RANGE, and Object::ToCreature().

Referenced by WorldSession::HandlePetActionHelper(), and WorldSession::HandlePetCastSpellOpcode().

◆ ProcDamageAndSpell()

void Unit::ProcDamageAndSpell ( Unit actor,
Unit victim,
uint32  procAttacker,
uint32  procVictim,
uint32  procEx,
uint32  amount,
WeaponAttackType  attType = BASE_ATTACK,
SpellInfo const *  procSpellInfo = nullptr,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
static
6379{
6380 // Not much to do if no flags are set.
6381 if (procAttacker && actor)
6382 actor->ProcDamageAndSpellFor(false, victim, procAttacker, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6383 // Now go on with a victim's events'n'auras
6384 // Not much to do if no flags are set or there is no victim
6385 if (victim && victim->IsAlive() && procVictim)
6386 victim->ProcDamageAndSpellFor(true, actor, procVictim, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6387}

References IsAlive(), and ProcDamageAndSpellFor().

Referenced by Spell::_cast(), Spell::_handle_finish_phase(), AttackerStateUpdate(), Spell::DoAllEffectOnTarget(), ReflectEvent::Execute(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and Kill().

◆ ProcDamageAndSpellFor()

void Unit::ProcDamageAndSpellFor ( bool  isVictim,
Unit target,
uint32  procFlag,
uint32  procExtra,
WeaponAttackType  attType,
SpellInfo const *  procSpellInfo,
uint32  damage,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
16042{
16043 // Player is loaded now - do not allow passive spell casts to proc
16044 if (IsPlayer() && ToPlayer()->GetSession()->PlayerLoading())
16045 return;
16046 // For melee/ranged based attack need update skills and set some Aura states if victim present
16047 if (procFlag & MELEE_BASED_TRIGGER_MASK && target && procPhase == PROC_SPELL_PHASE_HIT)
16048 {
16049 // Xinef: Shaman in ghost wolf form cant proc anything melee based
16050 if (!isVictim && GetShapeshiftForm() == FORM_GHOSTWOLF)
16051 return;
16052
16053 // Update skills here for players
16054 // only when you are not fighting other players or their pets/totems (pvp)
16055 if (IsPlayer() && !target->IsCharmedOwnedByPlayerOrPlayer())
16056 {
16057 // On melee based hit/miss/resist/parry/dodge need to update skill (for victim and attacker)
16059 {
16060 ToPlayer()->UpdateCombatSkills(target, attType, isVictim, procSpell ? procSpell->m_weaponItem : nullptr);
16061 }
16062 // Update defence if player is victim and we block - TODO: confirm that blocked attacks only have a chance to increase defence skill
16063 else if (isVictim && procExtra & (PROC_EX_BLOCK))
16064 {
16065 ToPlayer()->UpdateCombatSkills(target, attType, true);
16066 }
16067 }
16068 // If exist crit/parry/dodge/block need update aura state (for victim and attacker)
16070 {
16071 // for victim
16072 if (isVictim)
16073 {
16074 // if victim and dodge attack
16075 if (procExtra & PROC_EX_DODGE)
16076 {
16077 // Update AURA_STATE on dodge
16078 if (!IsClass(CLASS_ROGUE, CLASS_CONTEXT_ABILITY_REACTIVE)) // skip Rogue Riposte
16079 {
16082 }
16083 }
16084 // if victim and parry attack
16085 if (procExtra & PROC_EX_PARRY)
16086 {
16087 // For Hunters only Counterattack (skip Mongoose bite)
16089 {
16092 }
16093 else
16094 {
16097 }
16098 }
16099 // if and victim block attack
16100 if (procExtra & PROC_EX_BLOCK)
16101 {
16104 }
16105 }
16106 else // For attacker
16107 {
16108 // Overpower on victim dodge
16109 if (procExtra & PROC_EX_DODGE)
16110 {
16112 {
16113 AddComboPoints(target, 1);
16115 }
16116 }
16117
16118 // Wolverine Bite
16119 if ((procExtra & PROC_HIT_CRITICAL) && IsHunterPet())
16120 {
16121 AddComboPoints(target, 1);
16123 }
16124 }
16125 }
16126 }
16127
16128 Unit* actor = isVictim ? target : this;
16129 Unit* actionTarget = !isVictim ? target : this;
16130
16131 ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, procPhase, procExtra, procSpell, damageInfo, healInfo, procAura, procAuraEffectIndex);
16132
16133 ProcTriggeredList procTriggered;
16134 // Fill procTriggered list
16135 for (AuraApplicationMap::const_iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16136 {
16137 // Do not allow auras to proc from effect triggered by itself
16138 if (procAura && procAura->Id == itr->first)
16139 continue;
16140
16141 // Xinef: Generic Item Equipment cooldown, -1 is a special marker
16142 if (itr->second->GetBase()->GetCastItemGUID() && HasSpellItemCooldown(itr->first, uint32(-1)))
16143 continue;
16144
16145 ProcTriggeredData triggerData(itr->second->GetBase());
16146 // Defensive procs are active on absorbs (so absorption effects are not a hindrance)
16147 bool active = damage || (procExtra & PROC_EX_BLOCK && isVictim);
16148 if (isVictim)
16149 procExtra &= ~PROC_EX_INTERNAL_REQ_FAMILY;
16150
16151 SpellInfo const* spellProto = itr->second->GetBase()->GetSpellInfo();
16152
16153 // only auras that have trigger spell should proc from fully absorbed damage
16154 if (procExtra & PROC_EX_ABSORB && isVictim)
16155 if (damage || spellProto->Effects[EFFECT_0].TriggerSpell || spellProto->Effects[EFFECT_1].TriggerSpell || spellProto->Effects[EFFECT_2].TriggerSpell)
16156 active = true;
16157
16158 // xinef: fix spell procing from damaging / healing casts if spell has DoT / HoT effect only
16159 // only player spells are taken into account
16160 if (!active && !isVictim && !(procFlag & PROC_FLAG_DONE_PERIODIC) && procSpellInfo && procSpellInfo->SpellFamilyName && (procSpellInfo->HasAura(SPELL_AURA_PERIODIC_DAMAGE) || procSpellInfo->HasAura(SPELL_AURA_PERIODIC_HEAL)))
16161 active = true;
16162
16163 // AuraScript Hook
16164 if (!triggerData.aura->CallScriptCheckProcHandlers(itr->second, eventInfo))
16165 {
16166 continue;
16167 }
16168
16169 bool isTriggeredAtSpellProcEvent = IsTriggeredAtSpellProcEvent(target, triggerData.aura, attType, isVictim, active, triggerData.spellProcEvent, eventInfo);
16170
16171 // AuraScript Hook
16172 if (!triggerData.aura->CallScriptAfterCheckProcHandlers(itr->second, eventInfo, isTriggeredAtSpellProcEvent))
16173 {
16174 continue;
16175 }
16176
16177 // do checks using conditions table
16178 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_PROC, spellProto->Id);
16179 ConditionSourceInfo condInfo = ConditionSourceInfo(eventInfo.GetActor(), eventInfo.GetActionTarget());
16180 if (!sConditionMgr->IsObjectMeetToConditions(condInfo, conditions))
16181 {
16182 continue;
16183 }
16184
16185 // Triggered spells not triggering additional spells
16186 //bool triggered = !spellProto->HasAttribute(SPELL_ATTR3_CAN_PROC_FROM_PROCS) ?
16187 // (procExtra & PROC_EX_INTERNAL_TRIGGERED && !(procFlag & PROC_FLAG_DONE_TRAP_ACTIVATION)) : false;
16188
16189 bool hasTriggeredProc = false;
16190 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
16191 {
16192 if (itr->second->HasEffect(i))
16193 {
16194 AuraEffect* aurEff = itr->second->GetBase()->GetEffect(i);
16195
16196 // Skip this auras
16197 if (isNonTriggerAura[aurEff->GetAuraType()])
16198 continue;
16199
16200 // If not trigger by default and spellProcEvent == nullptr - skip
16201 if (!isTriggerAura[aurEff->GetAuraType()] && !triggerData.spellProcEvent)
16202 continue;
16203
16204 switch (aurEff->GetAuraType())
16205 {
16208 case SPELL_AURA_DUMMY:
16210 if (uint32 triggerSpellId = aurEff->GetSpellInfo()->Effects[i].TriggerSpell)
16211 {
16212 triggerData.triggerSpelId[i] = triggerSpellId;
16213 hasTriggeredProc = true;
16214 }
16215 break;
16216 default:
16217 break;
16218 }
16219
16220 // Some spells must always trigger
16221 //if (isAlwaysTriggeredAura[aurEff->GetAuraType()])
16222 triggerData.effMask |= 1 << i;
16223 }
16224 }
16225
16226 if (triggerData.effMask)
16227 {
16228 // If there is aura that triggers another proc aura, make sure that the triggered one is going to be proccessed on top of it
16229 if (hasTriggeredProc)
16230 {
16231 bool proccessed = false;
16232 for (uint8 i = 0; i < EFFECT_ALL; ++i)
16233 {
16234 if (uint32 triggeredSpellId = triggerData.triggerSpelId[i])
16235 {
16236 auto iter = std::find(procTriggered.begin(), procTriggered.end(), triggeredSpellId);
16237 if (iter != procTriggered.end())
16238 {
16239 std::advance(iter, 1);
16240 procTriggered.insert(iter, triggerData);
16241 proccessed = true;
16242 break;
16243 }
16244 }
16245 }
16246
16247 if (!proccessed)
16248 {
16249 procTriggered.push_front(triggerData);
16250 }
16251 }
16252 else
16253 {
16254 procTriggered.push_front(triggerData);
16255 }
16256 }
16257 }
16258
16259 // Nothing found
16260 if (procTriggered.empty())
16261 return;
16262
16263 // Note: must SetCantProc(false) before return
16265 SetCantProc(true);
16266
16267 // Handle effects proceed this time
16268 for (ProcTriggeredList::const_iterator i = procTriggered.begin(); i != procTriggered.end(); ++i)
16269 {
16270 // look for aura in auras list, it may be removed while proc event processing
16271 if (i->aura->IsRemoved())
16272 continue;
16273
16274 bool useCharges = i->aura->IsUsingCharges();
16275 // no more charges to use, prevent proc
16276 if (useCharges && !i->aura->GetCharges())
16277 continue;
16278
16279 bool takeCharges = false;
16280 SpellInfo const* spellInfo = i->aura->GetSpellInfo();
16281
16282 AuraApplication* aurApp = i->aura->GetApplicationOfTarget(GetGUID());
16283
16284 bool prepare = i->aura->CallScriptPrepareProcHandlers(aurApp, eventInfo);
16285
16286 // For players set spell cooldown if need
16287 uint32 cooldown = 0;
16288 if (prepare && i->spellProcEvent && i->spellProcEvent->cooldown)
16289 cooldown = i->spellProcEvent->cooldown;
16290
16291 // Xinef: set cooldown for actual proc
16292 eventInfo.SetProcCooldown(cooldown);
16293
16294 // Note: must SetCantProc(false) before return
16296 SetCantProc(true);
16297
16298 bool handled = i->aura->CallScriptProcHandlers(aurApp, eventInfo);
16299
16300 // "handled" is needed as long as proc can be handled in multiple places
16301 if (!handled && HandleAuraProc(target, damage, i->aura, procSpellInfo, procFlag, procExtra, cooldown, &handled))
16302 {
16303 uint32 Id = i->aura->GetId();
16304 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), Id);
16305 takeCharges = true;
16306 }
16307
16308 if (!handled)
16309 for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
16310 {
16311 if (!(i->effMask & (1 << effIndex)))
16312 continue;
16313
16314 AuraEffect* triggeredByAura = i->aura->GetEffect(effIndex);
16315 ASSERT(triggeredByAura);
16316
16317 bool prevented = i->aura->CallScriptEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16318 if (prevented)
16319 {
16320 takeCharges = true;
16321 continue;
16322 }
16323
16324 switch (triggeredByAura->GetAuraType())
16325 {
16327 {
16328 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16329 // Don`t drop charge or add cooldown for not started trigger
16330 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16331 takeCharges = true;
16332 break;
16333 }
16335 {
16336 // target has to be valid
16337 if (!eventInfo.GetProcTarget())
16338 break;
16339
16340 triggeredByAura->HandleProcTriggerDamageAuraProc(aurApp, eventInfo); // this function is part of the new proc system
16341 takeCharges = true;
16342 break;
16343 }
16345 case SPELL_AURA_DUMMY:
16346 {
16347 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} dummy aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16348 if (HandleDummyAuraProc(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, eventInfo))
16349 takeCharges = true;
16350 break;
16351 }
16356 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, isVictim ? "a victim's" : "an attacker's", triggeredByAura->GetId());
16357 takeCharges = true;
16358 break;
16360 {
16361 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16362 if (HandleOverrideClassScriptAuraProc(target, damage, triggeredByAura, procSpellInfo, cooldown))
16363 takeCharges = true;
16364 break;
16365 }
16367 {
16368 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16369 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16370 if (damage > 0)
16371 {
16373 takeCharges = true;
16374 }
16375 break;
16376 }
16378 {
16379 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16380 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16381 HandleAuraRaidProcFromCharge(triggeredByAura);
16382 takeCharges = true;
16383 break;
16384 }
16386 {
16387 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16388
16389 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16390 takeCharges = true;
16391 break;
16392 }
16394 // Skip melee hits or instant cast spells
16395 // xinef: check channeled spells which are affected by haste also
16396 if (procSpellInfo && (procSpellInfo->SpellFamilyName || !IsPlayer()) &&
16397 (procSpellInfo->CalcCastTime() > 0 /*||
16398 (procSpell->IsChanneled() && procSpell->GetDuration() > 0 && (HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, procSpell) || procSpell->HasAttribute(SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC)))*/))
16399 takeCharges = true;
16400 break;
16402 // Skip Melee hits and spells ws wrong school
16403 if (procSpellInfo && (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16404 takeCharges = true;
16405 break;
16407 // Skip Melee hits and targets with magnet aura
16408 if (procSpellInfo && (triggeredByAura->GetBase()->GetUnitOwner()->ToUnit() == ToUnit())) // Magnet
16409 takeCharges = true;
16410 break;
16413 // Skip melee hits and spells ws wrong school or zero cost
16414 if (procSpellInfo &&
16415 (procSpellInfo->ManaCost != 0 || procSpellInfo->ManaCostPercentage != 0 || (procSpellInfo->SpellFamilyFlags[1] & 0x2)) && // Cost check, mutilate include
16416 (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16417 takeCharges = true;
16418 break;
16421 // Compare mechanic
16422 if (procSpellInfo && procSpellInfo->Mechanic == uint32(triggeredByAura->GetMiscValue()))
16423 takeCharges = true;
16424 break;
16426 // Compare casters
16427 if (target && triggeredByAura->GetCasterGUID() == target->GetGUID())
16428 takeCharges = true;
16429 break;
16430 // CC Auras which use their amount amount to drop
16431 // Are there any more auras which need this?
16437 {
16438 // Spell own direct damage at apply wont break the CC
16439 // Xinef: Or when the aura is at full duration (assume that such auras should be added at the end, skipping all damage procs etc.)
16440 if (procSpellInfo)
16441 if ((!i->aura->IsPermanent() && i->aura->GetDuration() == i->aura->GetMaxDuration()) || procSpellInfo->Id == triggeredByAura->GetId() ||
16442 procSpellInfo->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
16443 break;
16444
16445 // chargeable mods are breaking on hit
16446 if (useCharges)
16447 takeCharges = true;
16448 else if (triggeredByAura->GetAmount()) // aura must have amount
16449 {
16450 int32 damageLeft = triggeredByAura->GetAmount();
16451 // No damage left
16452 if (damageLeft < int32(damage))
16453 i->aura->Remove();
16454 else
16455 triggeredByAura->SetAmount(damageLeft - damage);
16456 }
16457 break;
16458 }
16460 if (procSpellInfo && procSpellInfo->Id == 20647) // hack for warriors execute, both dummy and damage spell are affected by ignore aurastate aura
16461 break;
16462 takeCharges = true;
16463 break;
16466 {
16467 if (triggeredByAura->GetSpellModifier())
16468 {
16469 // Do proc if mod is consumed by spell
16470 if (!procSpell || procSpell->m_appliedMods.find(i->aura) != procSpell->m_appliedMods.end())
16471 {
16472 takeCharges = true;
16473 }
16474 }
16475 break;
16476 }
16477 default:
16478 takeCharges = true;
16479 break;
16480 }
16481 i->aura->CallScriptAfterEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16482 }
16483 // Remove charge (aura can be removed by triggers)
16484 // xinef: take into account attribute6 of proc spell
16485 if (prepare && useCharges && takeCharges)
16486 if (!procSpellInfo || isVictim || !procSpellInfo->HasAttribute(SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES))
16487 i->aura->DropCharge();
16488
16489 i->aura->CallScriptAfterProcHandlers(aurApp, eventInfo);
16490
16492 SetCantProc(false);
16493 }
16494
16495 // Cleanup proc requirements
16497 SetCantProc(false);
16498}
@ SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE
Definition: SpellAuraDefines.h:288
@ SPELL_AURA_ADD_PCT_MODIFIER
Definition: SpellAuraDefines.h:171
@ SPELL_AURA_OBS_MOD_POWER
Definition: SpellAuraDefines.h:84
@ SPELL_AURA_ADD_FLAT_MODIFIER
Definition: SpellAuraDefines.h:170
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
Definition: SpellAuraDefines.h:120
@ SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT
Definition: SpellAuraDefines.h:135
@ SPELL_AURA_MOD_POWER_COST_SCHOOL
Definition: SpellAuraDefines.h:136
@ SPELL_AURA_MECHANIC_IMMUNITY
Definition: SpellAuraDefines.h:140
@ SPELL_AURA_RAID_PROC_FROM_CHARGE
Definition: SpellAuraDefines.h:286
@ SPELL_AURA_PROC_TRIGGER_DAMAGE
Definition: SpellAuraDefines.h:106
@ SPELL_AURA_REFLECT_SPELLS_SCHOOL
Definition: SpellAuraDefines.h:137
@ SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:128
@ PROC_HIT_CRITICAL
Definition: SpellMgr.h:253
#define MELEE_BASED_TRIGGER_MASK
Definition: SpellMgr.h:182
@ PROC_EX_INTERNAL_CANT_PROC
Definition: SpellMgr.h:218
@ PROC_EX_INTERNAL_TRIGGERED
Definition: SpellMgr.h:221
@ PROC_FLAG_DONE_PERIODIC
Definition: SpellMgr.h:134
@ REACTIVE_OVERPOWER
Definition: Unit.h:590
@ REACTIVE_DEFENSE
Definition: Unit.h:588
@ REACTIVE_HUNTER_PARRY
Definition: Unit.h:589
@ REACTIVE_WOLVERINE_BITE
Definition: Unit.h:591
static bool isNonTriggerAura[TOTAL_AURAS]
Definition: Unit.cpp:104
static bool isTriggerAura[TOTAL_AURAS]
Definition: Unit.cpp:102
std::list< ProcTriggeredData > ProcTriggeredList
Definition: Unit.cpp:15841
@ CONDITION_SOURCE_TYPE_SPELL_PROC
Definition: ConditionMgr.h:146
@ EFFECT_2
Definition: SharedDefines.h:33
@ SPELL_ATTR3_INSTANT_TARGET_PROCS
Definition: SharedDefines.h:512
#define EFFECT_ALL
Definition: SharedDefines.h:38
@ SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES
Definition: SharedDefines.h:609
void UpdateCombatSkills(Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
Definition: PlayerUpdates.cpp:980
Definition: Unit.cpp:15822
Definition: Unit.h:420
void SetProcCooldown(uint32 cooldown)
Definition: Unit.h:454
Unit * GetActionTarget() const
Definition: Unit.h:440
Unit * GetProcTarget() const
Definition: Unit.h:441
bool HandleProcTriggerSpell(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
Definition: Unit.cpp:8925
bool HandleAuraRaidProcFromChargeWithValue(AuraEffect *triggeredByAura)
Definition: Unit.cpp:17549
bool IsHunterPet() const
Definition: Unit.h:711
bool IsTriggeredAtSpellProcEvent(Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
Definition: Unit.cpp:17410
bool HandleAuraProc(Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
Definition: Unit.cpp:8730
virtual bool HasSpellItemCooldown(uint32, uint32) const
Definition: Unit.h:1742
bool HandleDummyAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
Definition: Unit.cpp:6589
void StartReactiveTimer(ReactiveType reactive)
Definition: Unit.h:1666
bool HandleOverrideClassScriptAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
Definition: Unit.cpp:9852
bool HandleAuraRaidProcFromCharge(AuraEffect *triggeredByAura)
Definition: Unit.cpp:17638
bool IsCharmedOwnedByPlayerOrPlayer() const
Definition: Unit.h:1246
void HandleProcTriggerDamageAuraProc(AuraApplication *aurApp, ProcEventInfo &eventInfo)
Definition: SpellAuraEffects.cpp:7252
SpellModifier * GetSpellModifier() const
Definition: SpellAuraEffects.h:52
Unit * GetUnitOwner() const
Definition: SpellAuras.h:108

References AddComboPoints(), ASSERT, ProcTriggeredData::aura, AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, SpellInfo::CalcCastTime(), Aura::CallScriptAfterCheckProcHandlers(), Aura::CallScriptCheckProcHandlers(), CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_ROGUE, CLASS_WARRIOR, CONDITION_SOURCE_TYPE_SPELL_PROC, EFFECT_0, EFFECT_1, EFFECT_2, EFFECT_ALL, SpellInfo::Effects, ProcTriggeredData::effMask, FORM_GHOSTWOLF, ProcEventInfo::GetActionTarget(), ProcEventInfo::GetActor(), AuraEffect::GetAmount(), GetAppliedAuras(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), AuraEffect::GetCasterGUID(), Aura::GetEffect(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), ProcEventInfo::GetProcTarget(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), AuraEffect::GetSpellModifier(), Aura::GetUnitOwner(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandleProcTriggerDamageAuraProc(), HandleProcTriggerSpell(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpellItemCooldown(), SpellInfo::Id, IsCharmedOwnedByPlayerOrPlayer(), IsClass(), IsHunterPet(), isNonTriggerAura, Object::IsPlayer(), isTriggerAura, IsTriggeredAtSpellProcEvent(), LOG_DEBUG, Spell::m_appliedMods, Spell::m_weaponItem, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, MELEE_BASED_TRIGGER_MASK, ModifyAuraState(), PROC_EX_ABSORB, PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_INTERNAL_CANT_PROC, PROC_EX_INTERNAL_TRIGGERED, PROC_EX_MISS, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_EX_RESIST, PROC_FLAG_DONE_PERIODIC, PROC_HIT_CRITICAL, PROC_SPELL_PHASE_HIT, REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, REACTIVE_WOLVERINE_BITE, SpellInfo::SchoolMask, sConditionMgr, AuraEffect::SetAmount(), SetCantProc(), ProcEventInfo::SetProcCooldown(), SPELL_ATTR3_INSTANT_TARGET_PROCS, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES, SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELL_AURA_ADD_FLAT_MODIFIER, SPELL_AURA_ADD_PCT_MODIFIER, SPELL_AURA_DUMMY, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MECHANIC_IMMUNITY, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_MECHANIC_RESISTANCE, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_MOD_POWER_COST_SCHOOL, SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_STUN, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_DAMAGE, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_AURA_RAID_PROC_FROM_CHARGE, SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_AURA_SPELL_MAGNET, SPELL_AURA_TRANSFORM, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, ProcTriggeredData::spellProcEvent, StartReactiveTimer(), Object::ToPlayer(), Object::ToUnit(), ProcTriggeredData::triggerSpelId, and Player::UpdateCombatSkills().

Referenced by CalcAbsorbResist(), and ProcDamageAndSpell().

◆ processDummyAuras()

float Unit::processDummyAuras ( float  TakenTotalMod) const
private
11889{
11890 // note: old code coming from TC, just extracted here to remove the code duplication + solve potential crash
11891 // see: https://github.com/TrinityCore/TrinityCore/commit/c85710e148d75450baedf6632b9ca6fd40b4148e
11892
11893 // .. taken pct: dummy auras
11894 auto const& mDummyAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
11895 for (auto i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
11896 {
11897 if (!(*i) || !(*i)->GetSpellInfo())
11898 {
11899 continue;
11900 }
11901
11902 if (auto spellIconId = (*i)->GetSpellInfo()->SpellIconID)
11903 {
11904 switch (spellIconId)
11905 {
11906 // Cheat Death
11907 case 2109:
11908 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
11909 {
11910 // Patch 2.4.3: The resilience required to reach the 90% damage reduction cap
11911 // is 22.5% critical strike damage reduction, or 444 resilience.
11912 // To calculate for 90%, we multiply the 100% by 4 (22.5% * 4 = 90%)
11913 float mod = -1.0f * GetMeleeCritDamageReduction(400);
11914 AddPct(TakenTotalMod, std::max(mod, float((*i)->GetAmount())));
11915 }
11916 break;
11917 }
11918 }
11919 }
11920 return TakenTotalMod;
11921}

References AddPct(), GetAuraEffectsByType(), GetMeleeCritDamageReduction(), SPELL_AURA_DUMMY, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by MeleeDamageBonusTaken(), and SpellDamageBonusTaken().

◆ ProcessPositionDataChanged()

void Unit::ProcessPositionDataChanged ( PositionFullTerrainStatus const &  data)
overridevirtual

Reimplemented from WorldObject.

4255{
4258}
virtual void ProcessPositionDataChanged(PositionFullTerrainStatus const &data)
Definition: Object.cpp:1163
virtual void ProcessTerrainStatusUpdate()
Definition: Unit.cpp:4260

References WorldObject::ProcessPositionDataChanged(), and ProcessTerrainStatusUpdate().

Referenced by Creature::Create().

◆ ProcessTerrainStatusUpdate()

void Unit::ProcessTerrainStatusUpdate ( )
virtual

Reimplemented in Player.

4261{
4262 if (IsCreature())
4264
4265 if (IsFlying() || (!IsControlledByPlayer()))
4266 return;
4267
4268 LiquidData const& liquidData = GetLiquidData();
4269
4270 // remove appropriate auras if we are swimming/not swimming respectively
4271 if (liquidData.Status & MAP_LIQUID_STATUS_SWIMMING)
4273 else if (!isSwimming())
4275
4276 // liquid aura handling
4277 LiquidTypeEntry const* curLiquid = nullptr;
4278 if ((liquidData.Status & MAP_LIQUID_STATUS_SWIMMING))
4279 curLiquid = sLiquidTypeStore.LookupEntry(liquidData.Entry);
4280
4281 if (curLiquid != _lastLiquid)
4282 {
4285
4286 // Set _lastLiquid before casting liquid spell to avoid infinite loops
4287 _lastLiquid = curLiquid;
4288
4290 if (curLiquid && curLiquid->SpellId && (!player || !player->IsGameMaster()))
4291 CastSpell(this, curLiquid->SpellId, true);
4292 }
4293}
DBCStorage< LiquidTypeEntry > sLiquidTypeStore(LiquidTypefmt)
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition: SpellDefines.h:50
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition: SpellDefines.h:51
void UpdateMovementFlags()
Definition: Creature.cpp:3435
bool isSwimming() const
Definition: Unit.h:1713
bool IsFlying() const
Definition: Unit.h:1715
Definition: Map.h:171
uint32 Entry
Definition: Map.h:174
Definition: DBCStructure.h:1282
uint32 SpellId
Definition: DBCStructure.h:1288

References _lastLiquid, AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, CastSpell(), LiquidData::Entry, GetCharmerOrOwnerPlayerOrPlayerItself(), WorldObject::GetLiquidData(), IsControlledByPlayer(), Object::IsCreature(), IsFlying(), Player::IsGameMaster(), isSwimming(), MAP_LIQUID_STATUS_SWIMMING, RemoveAurasDueToSpell(), RemoveAurasWithInterruptFlags(), sLiquidTypeStore, LiquidTypeEntry::SpellId, LiquidData::Status, Object::ToCreature(), and Creature::UpdateMovementFlags().

Referenced by ProcessPositionDataChanged(), and Player::ProcessTerrainStatusUpdate().

◆ ProhibitSpellSchool()

virtual void Unit::ProhibitSpellSchool ( SpellSchoolMask  ,
uint32   
)
inlinevirtual

Reimplemented in Creature, and Player.

1455{ }

Referenced by Spell::EffectInterruptCast().

◆ propagateSpeedChange()

void Unit::propagateSpeedChange ( )
inline

-------—End of Pet responses methods-------—

void propagateSpeedChange()
Definition: MotionMaster.cpp:890

References GetMotionMaster(), and MotionMaster::propagateSpeedChange().

Referenced by SetSpeed(), and SetWalk().

◆ RecalculateObjectScale()

void Unit::RecalculateObjectScale ( )
virtual
16742{
16744 float scale = GetNativeObjectScale() + CalculatePct(1.0f, scaleAuras);
16745 float scaleMin = IsPlayer() ? 0.1f : 0.01f;
16746 SetObjectScale(std::max(scale, scaleMin));
16747}
@ SPELL_AURA_MOD_SCALE_2
Definition: SpellAuraDefines.h:302
@ SPELL_AURA_MOD_SCALE
Definition: SpellAuraDefines.h:124
virtual void SetObjectScale(float scale)
Definition: Object.h:116
virtual float GetNativeObjectScale() const
Definition: Unit.h:1519

References CalculatePct(), GetNativeObjectScale(), GetTotalAuraModifier(), Object::IsPlayer(), Object::SetObjectScale(), SPELL_AURA_MOD_SCALE, and SPELL_AURA_MOD_SCALE_2.

Referenced by AuraEffect::HandleAuraModScale().

◆ RemoveAllAttackers()

void Unit::RemoveAllAttackers ( )

Remove all units in m_attackers list and send them AttackStop()

10476{
10477 while (!m_attackers.empty())
10478 {
10479 AttackerSet::iterator iter = m_attackers.begin();
10480 if (!(*iter)->AttackStop())
10481 {
10482 LOG_ERROR("entities.unit", "WORLD: Unit has an attacker that isn't attacking it!");
10483 m_attackers.erase(iter);
10484 }
10485 }
10486}

References LOG_ERROR, and m_attackers.

Referenced by CombatStop(), Spell::EffectSanctuary(), AuraEffect::HandleFeignDeath(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), and npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI().

◆ RemoveAllAuras()

void Unit::RemoveAllAuras ( )
5320{
5321 // this may be a dead loop if some events on aura remove will continiously apply aura on remove
5322 // we want to have all auras removed, so use your brain when linking events
5323 while (!m_appliedAuras.empty() || !m_ownedAuras.empty())
5324 {
5325 AuraApplicationMap::iterator aurAppIter;
5326 for (aurAppIter = m_appliedAuras.begin(); aurAppIter != m_appliedAuras.end();)
5328
5329 AuraMap::iterator aurIter;
5330 for (aurIter = m_ownedAuras.begin(); aurIter != m_ownedAuras.end();)
5331 RemoveOwnedAura(aurIter);
5332 }
5333}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by CleanupBeforeRemoveFromMap(), npc_mograine::npc_mograineAI::DamageTaken(), boss_kiljaeden::boss_kiljaedenAI::DamageTaken(), boss_muru::boss_muruAI::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_taldaram::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), boss_leotheras_the_blind::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), boss_razorgore::boss_razorgoreAI::DoChangePhase(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::FinishQuest(), spell_herald_volzaj_insanity::HandleDummyEffect(), misc_commandscript::HandleUnAuraCommand(), boss_ick::boss_ickAI::JustDied(), boss_venoxis::JustDied(), boss_taldaram::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_commander_stoutbeard::boss_commander_stoutbeardAI::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustReachedHome(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustReachedHome(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustReachedHome(), boss_urom::boss_uromAI::LeaveCombat(), boss_taldaram::MovementInform(), npc_hallows_end_soh::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), spell_kaelthas_flame_strike::OnRemove(), PretendToDie(), boss_alar::PretendToDie(), Creature::RemoveCorpse(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::Reset(), boss_venoxis::Reset(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_bjarngrim::boss_bjarngrimAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_hodir::boss_hodirAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_skadi::boss_skadiAI::Reset(), boss_skadi_grauf::boss_skadi_graufAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), Pet::SavePetToDB(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), npc_harrison_jones::npc_harrison_jonesAI::SpellHit(), npc_frost_sphere::npc_frost_sphereAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_magus_telestra::boss_magus_telestraAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), and npc_aeranas::npc_aeranasAI::UpdateAI().

◆ RemoveAllAurasExceptType()

void Unit::RemoveAllAurasExceptType ( AuraType  type)
5394{
5395 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5396 {
5397 Aura const* aura = iter->second->GetBase();
5398 if (aura->GetSpellInfo()->HasAura(type))
5399 ++iter;
5400 else
5402 }
5403
5404 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5405 {
5406 Aura* aura = iter->second;
5407 if (aura->GetSpellInfo()->HasAura(type))
5408 ++iter;
5409 else
5411 }
5412}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), SpellInfo::HasAura(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ RemoveAllAurasOnDeath()

void Unit::RemoveAllAurasOnDeath ( )
5350{
5351 // used just after dieing to remove all visible auras
5352 // and disable the mods for the passive ones
5353 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5354 {
5355 Aura const* aura = iter->second->GetBase();
5358 else
5359 ++iter;
5360 }
5361
5362 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5363 {
5364 Aura* aura = iter->second;
5367 else
5368 ++iter;
5369 }
5370}
@ AURA_REMOVE_BY_DEATH
Definition: SpellAuraDefines.h:396
@ SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD
Definition: SharedDefines.h:643
bool IsDeathPersistent() const
Definition: SpellAuras.cpp:1087

References _UnapplyAura(), AURA_REMOVE_BY_DEATH, Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsDeathPersistent(), Aura::IsPassive(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), and SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD.

Referenced by spell_dk_death_pact::FilterTargets(), Kill(), Player::LoadFromDB(), and setDeathState().

◆ RemoveAllAurasRequiringDeadTarget()

void Unit::RemoveAllAurasRequiringDeadTarget ( )
5373{
5374 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5375 {
5376 Aura const* aura = iter->second->GetBase();
5377 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5379 else
5380 ++iter;
5381 }
5382
5383 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5384 {
5385 Aura* aura = iter->second;
5386 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5388 else
5389 ++iter;
5390 }
5391}
bool IsRequiringDeadTarget() const
Definition: SpellInfo.cpp:1221

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), Aura::IsPassive(), SpellInfo::IsRequiringDeadTarget(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by Player::LoadFromDB().

◆ RemoveAllControlled()

void Unit::RemoveAllControlled ( bool  onDeath = false)
11073{
11074 // possessed pet and vehicle
11075 if (IsPlayer())
11077
11078 while (!m_Controlled.empty())
11079 {
11080 Unit* target = *m_Controlled.begin();
11081 m_Controlled.erase(m_Controlled.begin());
11082 if (target->GetCharmerGUID() == GetGUID())
11083 {
11084 target->RemoveCharmAuras();
11085 }
11086 else if (target->GetOwnerGUID() == GetGUID() && target->IsSummon())
11087 {
11088 if (!(onDeath && !IsPlayer() && target->IsGuardian()))
11089 {
11090 target->ToTempSummon()->UnSummon();
11091 }
11092 }
11093 else
11094 {
11095 LOG_ERROR("entities.unit", "Unit {} is trying to release unit {} which is neither charmed nor owned by it", GetEntry(), target->GetEntry());
11096 }
11097 }
11098}
void StopCastingCharm(Aura *except=nullptr)
Definition: Player.cpp:9294
bool IsGuardian() const
Definition: Unit.h:708
void RemoveCharmAuras()
Definition: Unit.cpp:11183

References GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), IsGuardian(), Object::IsPlayer(), IsSummon(), LOG_ERROR, m_Controlled, RemoveCharmAuras(), Player::StopCastingCharm(), Object::ToPlayer(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ RemoveAllDynObjects()

void Unit::RemoveAllDynObjects ( )
6164{
6165 while (!m_dynObj.empty())
6166 m_dynObj.front()->Remove();
6167}

References m_dynObj.

Referenced by RemoveFromWorld(), Player::TeleportTo(), and npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI().

◆ RemoveAllGameObjects()

void Unit::RemoveAllGameObjects ( )
6264{
6265 while(!m_gameObj.empty())
6266 {
6267 GameObject* go = ObjectAccessor::GetGameObject(*this, *m_gameObj.begin());
6268 if (go)
6269 {
6271 go->SetRespawnTime(0);
6272 go->Delete();
6273 }
6274 m_gameObj.erase(m_gameObj.begin());
6275 }
6276}
void Delete()
Definition: GameObject.cpp:979
void SetRespawnTime(int32 respawn)
Definition: GameObject.cpp:1303

References GameObject::Delete(), ObjectGuid::Empty, ObjectAccessor::GetGameObject(), m_gameObj, GameObject::SetOwnerGUID(), and GameObject::SetRespawnTime().

Referenced by CleanupBeforeRemoveFromMap(), npc_ice_tomb::npc_ice_tombAI::JustDied(), RemoveFromWorld(), npc_brewfest_super_brew_trigger::UpdateAI(), and boss_sapphiron::boss_sapphironAI::UpdateAI().

◆ RemoveAllMinionsByEntry()

void Unit::RemoveAllMinionsByEntry ( uint32  entry)
10850{
10851 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10852 {
10853 Unit* unit = *itr;
10854 ++itr;
10855 if (unit->GetEntry() == entry && unit->IsCreature()
10856 && unit->ToCreature()->IsSummon()) // minion, actually
10857 unit->ToTempSummon()->UnSummon();
10858 // i think this is safe because i have never heard that a despawned minion will trigger a same minion
10859 }
10860}

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, Object::ToCreature(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Player::ApplyEquipSpell(), Spell::EffectSummonType(), npc_nelson::npc_nelsonAI::Reset(), SetMinion(), and npc_nelson::npc_nelsonAI::UpdateAI().

◆ RemoveAppliedAuras() [1/2]

void Unit::RemoveAppliedAuras ( std::function< bool(AuraApplication const *)> const &  check)
4871{
4872 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
4873 {
4874 if (check(iter->second))
4875 {
4876 RemoveAura(iter);
4877 continue;
4878 }
4879 ++iter;
4880 }
4881}

References m_appliedAuras, and RemoveAura().

Referenced by RemoveArenaAuras().

◆ RemoveAppliedAuras() [2/2]

void Unit::RemoveAppliedAuras ( uint32  spellId,
std::function< bool(AuraApplication const *)> const &  check 
)
4897{
4898 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4899 {
4900 if (check(iter->second))
4901 {
4902 RemoveAura(iter);
4903 continue;
4904 }
4905 ++iter;
4906 }
4907}

References m_appliedAuras, and RemoveAura().

◆ RemoveAreaAurasDueToLeaveWorld()

void Unit::RemoveAreaAurasDueToLeaveWorld ( )
5287{
5288 // make sure that all area auras not applied on self are removed - prevent access to deleted pointer later
5289 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5290 {
5291 Aura* aura = iter->second;
5292 ++iter;
5293 Aura::ApplicationMap const& appMap = aura->GetApplicationMap();
5294 for (Aura::ApplicationMap::const_iterator itr = appMap.begin(); itr != appMap.end();)
5295 {
5296 AuraApplication* aurApp = itr->second;
5297 ++itr;
5298 Unit* target = aurApp->GetTarget();
5299 if (target == this)
5300 continue;
5301 target->RemoveAura(aurApp);
5302 // things linked on aura remove may apply new area aura - so start from the beginning
5303 iter = m_ownedAuras.begin();
5304 }
5305 }
5306
5307 // remove area auras owned by others
5308 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5309 {
5310 if (iter->second->GetBase()->GetOwner() != this)
5311 {
5312 RemoveAura(iter);
5313 }
5314 else
5315 ++iter;
5316 }
5317}
ApplicationMap const & GetApplicationMap()
Definition: SpellAuras.h:181
std::map< ObjectGuid, AuraApplication * > ApplicationMap
Definition: SpellAuras.h:90

References Aura::GetApplicationMap(), AuraApplication::GetTarget(), m_appliedAuras, m_ownedAuras, and RemoveAura().

Referenced by RemoveFromWorld().

◆ RemoveArenaAuras()

void Unit::RemoveArenaAuras ( )
5336{
5337 // in join, remove positive buffs, on end, remove negative
5338 // used to remove positive visible auras in arenas
5339 RemoveAppliedAuras([](AuraApplication const* aurApp)
5340 {
5341 Aura const* aura = aurApp->GetBase();
5342 return (!aura->GetSpellInfo()->HasAttribute(SPELL_ATTR4_ALLOW_ENETRING_ARENA) // don't remove stances, shadowform, pally/hunter auras
5343 && !aura->IsPassive() // don't remove passive auras
5344 && (aurApp->IsPositive() || !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD))) || // not negative death persistent auras
5345 aura->GetSpellInfo()->HasAttribute(SPELL_ATTR5_REMOVE_ENTERING_ARENA); // special marker, always remove
5346 });
5347}
@ SPELL_ATTR5_REMOVE_ENTERING_ARENA
Definition: SharedDefines.h:569
@ SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD
Definition: SharedDefines.h:513
@ SPELL_ATTR4_ALLOW_ENETRING_ARENA
Definition: SharedDefines.h:551
void RemoveAppliedAuras(std::function< bool(AuraApplication const *)> const &check)
Definition: Unit.cpp:4870
bool IsPositive() const
Definition: SpellAuras.h:68

References AuraApplication::GetBase(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsPassive(), AuraApplication::IsPositive(), RemoveAppliedAuras(), SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD, SPELL_ATTR4_ALLOW_ENETRING_ARENA, and SPELL_ATTR5_REMOVE_ENTERING_ARENA.

Referenced by Player::TeleportTo().

◆ RemoveAura() [1/4]

void Unit::RemoveAura ( Aura aur,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4850{
4851 if (aura->IsRemoved())
4852 return;
4853 if (AuraApplication* aurApp = aura->GetApplicationOfTarget(GetGUID()))
4854 RemoveAura(aurApp, mode);
4855}

References Aura::GetApplicationOfTarget(), Object::GetGUID(), Aura::IsRemoved(), and RemoveAura().

◆ RemoveAura() [2/4]

void Unit::RemoveAura ( AuraApplication aurApp,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4807{
4808 // we've special situation here, RemoveAura called while during aura removal
4809 // this kind of call is needed only when aura effect removal handler
4810 // or event triggered by it expects to remove
4811 // not yet removed effects of an aura
4812 if (aurApp->GetRemoveMode())
4813 {
4814 // remove remaining effects of an aura
4815 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4816 {
4817 if (aurApp->HasEffect(itr))
4818 aurApp->_HandleEffect(itr, false);
4819 }
4820 return;
4821 }
4822 // no need to remove
4823 if (aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) != aurApp || aurApp->GetBase()->IsRemoved())
4824 return;
4825
4826 uint32 spellId = aurApp->GetBase()->GetId();
4827 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4828
4829 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4830 {
4831 if (aurApp == iter->second)
4832 {
4833 // Prevent Arena Preparation aura from being removed by player actions
4834 // It's an invisibility spell so any interaction/spell cast etc. removes it.
4835 // Should only be removed by the arena script, once the match starts.
4837 {
4838 return;
4839 }
4840
4841 RemoveAura(iter, mode);
4842 return;
4843 }
4844 else
4845 ++iter;
4846 }
4847}
@ SPELL_AURA_ARENA_PREPARATION
Definition: SpellAuraDefines.h:278

References AuraApplication::_HandleEffect(), Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), AuraApplication::GetRemoveMode(), AuraApplication::HasEffect(), Aura::HasEffectType(), Aura::IsRemoved(), m_appliedAuras, MAX_SPELL_EFFECTS, RemoveAura(), and SPELL_AURA_ARENA_PREPARATION.

◆ RemoveAura() [3/4]

void Unit::RemoveAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4777{
4778 AuraApplication* aurApp = i->second;
4779 // Do not remove aura which is already being removed
4780 if (aurApp->GetRemoveMode())
4781 return;
4782 Aura* aura = aurApp->GetBase();
4783 _UnapplyAura(i, mode);
4784 // Remove aura - for Area and Target auras
4785 if (aura->GetOwner() == this)
4786 aura->Remove(mode);
4787}

References _UnapplyAura(), AuraApplication::GetBase(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), and Aura::Remove().

Referenced by _RemoveNoStackAurasDueToAura(), boss_marli::_schedulePhaseTroll(), ApplySpellDispelImmunity(), Player::CheckAreaExploreAndOutdoor(), boss_gyth::boss_gythAI::DamageTaken(), boss_headless_horseman::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_hor_lich_king::npc_hor_lich_kingAI::DoAction(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_paletress::boss_paletressAI::DoAction(), boss_vezax::boss_vezaxAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DoAction(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::DoAction(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), Player::DuelComplete(), Spell::EffectDispelMechanic(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectSummonPet(), Spell::EffectTriggerSpell(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), GetDiseasesByCaster(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_q12096_q12092_bark::HandleDummy(), HandleDummyAuraProc(), spell_valanar_kinetic_bomb_aura::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_midsummer_ribbon_pole::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), spell_dk_presence::HandleEffectRemove(), spell_pal_blessing_of_sanctuary::HandleEffectRemove(), spell_sha_chain_heal::HandleHeal(), spell_sindragosa_frost_breath::HandleInfusion(), spell_warl_demonic_circle_summon::HandleRemove(), spell_putricide_eat_ooze::HandleScript(), AuraEffect::HandleShapeshiftBoosts(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_jaraxxus::boss_jaraxxusAI::JustEngagedWith(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::JustEngagedWith(), npc_ulduar_snow_mound::MoveInLineOfSight(), spell_blood_queen_vampiric_bite::OnCast(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), npc_essence_of_twin::OnGossipHello(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), npc_thrall_bfu::OnQuestReward(), npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), BattlefieldWG::PromotePlayer(), RemoveAppliedAuras(), RemoveAreaAurasDueToLeaveWorld(), RemoveAura(), RemoveAurasByShapeShift(), RemoveAurasByType(), RemoveAurasDueToItemSpell(), RemoveAurasDueToSpell(), RemoveAurasWithAttribute(), RemoveAurasWithFamily(), RemoveAurasWithInterruptFlags(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), BattlegroundIC::RemovePlayer(), BattlegroundMap::RemovePlayerFromMap(), boss_bjarngrim::boss_bjarngrimAI::RemoveStanceAura(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_marli::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), NPCStaveQuestAI::ResetState(), boss_anomalus::boss_anomalusAI::SetData(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_malygos::boss_malygosAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), boss_headless_horseman::SpellHit(), boss_viscidus::SpellHit(), spell_pal_hand_of_sacrifice_aura::Split(), boss_sartharion_shadron::boss_sartharion_shadronAI::SummonedCreatureDies(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_harrison_jones::npc_harrison_jonesAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_viscidus::UpdateAI(), boss_taldaram::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), Spell::UpdateChanneledTargetList(), and boss_bjarngrim::boss_bjarngrimAI::WaypointReached().

◆ RemoveAura() [4/4]

void Unit::RemoveAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4790{
4791 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4792 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4793 {
4794 Aura const* aura = iter->second->GetBase();
4795 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4796 && (!caster || aura->GetCasterGUID() == caster))
4797 {
4798 RemoveAura(iter, removeMode);
4799 return;
4800 }
4801 else
4802 ++iter;
4803 }
4804}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

◆ RemoveAuraFromStack()

void Unit::RemoveAuraFromStack ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4926{
4927 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4928 for (AuraMap::iterator iter = range.first; iter != range.second;)
4929 {
4930 Aura* aura = iter->second;
4931 if ((aura->GetType() == UNIT_AURA_TYPE)
4932 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4933 {
4934 aura->ModStackAmount(-1, removeMode);
4935 return;
4936 }
4937 else
4938 ++iter;
4939 }
4940}
@ UNIT_AURA_TYPE
Definition: SpellAuraDefines.h:385
bool ModStackAmount(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, bool periodicReset=false)
Definition: SpellAuras.cpp:1021
AuraObjectType GetType() const
Definition: SpellAuras.cpp:481

References Aura::GetCasterGUID(), Aura::GetType(), m_ownedAuras, Aura::ModStackAmount(), and UNIT_AURA_TYPE.

Referenced by Spell::EffectSchoolDMG(), HandleAuraProc(), HandleDummyAuraProc(), spell_putricide_gaseous_bloat_aura::HandleExtraEffect(), spell_oculus_evasive_maneuvers_aura::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_item_brittle_armor::HandleScript(), spell_item_mercurial_shield::HandleScript(), boss_viscidus::SpellHit(), and boss_selin_fireheart::UpdateAI().

◆ RemoveAurasByShapeShift()

void Unit::RemoveAurasByShapeShift ( )
5271{
5272 uint32 mechanic_mask = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT);
5273 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5274 {
5275 Aura const* aura = iter->second->GetBase();
5276 if ((aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask) &&
5278 {
5279 RemoveAura(iter);
5280 continue;
5281 }
5282 ++iter;
5283 }
5284}
@ SPELL_ATTR0_CU_AURA_CC
Definition: SpellInfo.h:181
uint32 GetAllEffectsMechanicMask() const
Definition: SpellInfo.cpp:1991

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), m_appliedAuras, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), SPELL_ATTR0_CU_AURA_CC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by AuraEffect::HandleAuraModShapeshift().

◆ RemoveAurasByType()

void Unit::RemoveAurasByType ( AuraType  auraType,
ObjectGuid  casterGUID = ObjectGuid::Empty,
Aura except = nullptr,
bool  negative = true,
bool  positive = true 
)
5111{
5112 // simple check if list is empty
5113 if (m_modAuras[auraType].empty())
5114 return;
5115
5116 for (AuraEffectList::iterator iter = m_modAuras[auraType].begin(); iter != m_modAuras[auraType].end();)
5117 {
5118 Aura* aura = (*iter)->GetBase();
5120
5121 ++iter;
5122 if (aura != except && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5123 && ((negative && !aurApp->IsPositive()) || (positive && aurApp->IsPositive())))
5124 {
5125 uint32 removedAuras = m_removedAurasCount;
5126 RemoveAura(aurApp);
5127 if (m_removedAurasCount > removedAuras + 1)
5128 iter = m_modAuras[auraType].begin();
5129 }
5130 }
5131}

References Aura::GetApplicationOfTarget(), Aura::GetCasterGUID(), Object::GetGUID(), AuraApplication::IsPositive(), m_modAuras, m_removedAurasCount, and RemoveAura().

Referenced by _EnterVehicle(), Spell::_handle_finish_phase(), Player::ActivateTaxiPathTo(), Battleground::AddPlayer(), Attack(), spell_gen_summon_tournament_mount::CheckIfLanceEquipped(), ClearComboPoints(), Player::ContinueTaxiFlight(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), Spell::DoSpellHitOnUnit(), Spell::EffectPowerBurn(), Spell::EffectTriggerSpell(), BattlegroundWS::EventPlayerClickedOnFlag(), ExitVehicle(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItemsEvent(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraModStateImmunity(), AuraEffect::HandleAuraMounted(), AuraEffect::HandleAuraTransform(), WorldSession::HandleBankerActivateOpcode(), WorldSession::HandleBinderActivateOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleBuyStableSlot(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_item_reindeer_transformation::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), HandleDummyAuraProc(), spell_rog_vanish::HandleEffect(), spell_hydross_mark_of_hydross::HandleEffectApply(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleListStabledPetsOpcode(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), WorldSession::HandleMoveWorldportAck(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_algalon_remove_phase_aura::HandlePeriodic(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSaveGuildEmblemOpcode(), spell_gen_mine_sweeper::HandleSchoolDMG(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSpiritHealerActivateOpcode(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleTabardVendorActivateOpcode(), WorldSession::HandleTalentWipeConfirmOpcode(), WorldSession::HandleTaxiQueryAvailableNodes(), WorldSession::HandleTrainerBuySpellOpcode(), WorldSession::HandleUnstablePet(), boss_gurtogg_bloodboil::JustEngagedWith(), Player::LeaveBattleground(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), spell_gen_aura_service_uniform::OnApply(), Player::ProcessDelayedOperations(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Vehicle::RemoveAllPassengers(), RemoveBindSightAuras(), RemoveCharmAuras(), Battleground::RemovePlayerAtLeave(), WorldSession::SendDoFlight(), WorldSession::SendListInventory(), Player::SendLoot(), WorldSession::SendTrainerList(), SetCharmedBy(), Player::StopCastingCharm(), Player::TeleportTo(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), GameObject::Use(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ RemoveAurasDueToItemSpell()

void Unit::RemoveAurasDueToItemSpell ( uint32  spellId,
ObjectGuid  castItemGuid 
)
5086{
5087 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
5088 {
5089 if (iter->second->GetBase()->GetCastItemGUID() == castItemGuid)
5090 {
5091 RemoveAura(iter);
5092 iter = m_appliedAuras.lower_bound(spellId);
5093 }
5094 else
5095 ++iter;
5096 }
5097
5098 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
5099 {
5100 if (iter->second->GetCastItemGUID() == castItemGuid)
5101 {
5103 iter = m_ownedAuras.lower_bound(spellId);
5104 }
5105 else
5106 ++iter;
5107 }
5108}

References AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, RemoveAura(), and RemoveOwnedAura().

Referenced by Player::ApplyEnchantment(), and Player::ApplyEquipSpell().

◆ RemoveAurasDueToSpell()

void Unit::RemoveAurasDueToSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4910{
4911 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4912 {
4913 Aura const* aura = iter->second->GetBase();
4914 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4915 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4916 {
4917 RemoveAura(iter, removeMode);
4918 iter = m_appliedAuras.lower_bound(spellId);
4919 }
4920 else
4921 ++iter;
4922 }
4923}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

Referenced by Spell::_cast(), Player::_removeTalentAurasAndSpells(), Player::ActivateSpec(), Vehicle::AddPassenger(), spell_commander_sarannis_arcane_devastation::AfterApply(), spell_dru_feral_swiftness::AfterRemove(), spell_dru_barkskin::AfterRemove(), spell_dru_savage_roar_aura::AfterRemove(), spell_dru_survival_instincts_aura::AfterRemove(), Player::ApplyEquipSpell(), boss_hakkar::boss_hakkarAI::ApplyHakkarPowerStacks(), boss_buru::ChaseNewVictim(), spell_eredar_twins_handle_touch::CheckCast(), boss_volazj::CheckPhaseMinions(), spell_botanica_shift_form_aura::CheckProc(), spell_mage_burning_determination::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), Player::CleanupAfterTaxiFlight(), AuraEffect::CleanupTriggeredSpells(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), spell_ruby_sanctum_rallying_shout::CountAllies(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_buru::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_leotheras_the_blind::DemonTime(), Player::DestroyItem(), npc_drakonid_spawner::DoAction(), npc_twilight_volunteer::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_frozen_core::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), npc_pet_gen_argent_pony_bridle::DoAction(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::DoTriggersOnSpellHit(), Spell::EffectApplyGlyph(), Spell::EffectHeal(), Spell::EffectRemoveAura(), Spell::EffectSchoolDMG(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_halazzi::EnterPhase(), boss_zuljin::boss_zuljinAI::EnterPhase(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), BattleExperienceEvent::Execute(), SendEncounterUnit::Execute(), FrostBombExplosion::Execute(), AuraRemoveEvent::Execute(), spell_sindragosa_ice_tomb_trap_aura::ExtraRemoveEffect(), spell_mother_shahraz_fatal_attraction_dummy::FilterTargets(), spell_warr_improved_spell_reflection_trigger::FilterTargets(), lfg::LFGMgr::FinishDungeon(), spell_dru_berserk::HandleAfterCast(), spell_capacitus_polarity_charge_aura::HandleAfterRemove(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), boss_janalai::boss_janalaiAI::HandleBombSequence(), spell_moroes_vanish::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_warhead_detonate::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), HandleDummyAuraProc(), spell_magtheridon_shadow_grasp_visual::HandleDummyRemove(), spell_shadowfang_keep_forsaken_skills::spell_shadowfang_keep_forsaken_skills_AuraScript::HandleDummyTick(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_q12730_quenching_mist::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectRemove(), spell_serpentshrine_cavern_coilfang_water::HandleEffectRemove(), spell_q10769_dissension_amongst_the_ranks_aura::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), spell_midsummer_fling_torch::HandleFinish(), gm_commandscript::HandleGMVisibleCommand(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), spell_transitus_shield_beam_aura::HandleOnEffectRemove(), OPvPCapturePointZM_GraveYard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_algalon_remove_phase_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), OutdoorPvPNA::HandlePlayerLeaveZone(), OutdoorPvPSI::HandlePlayerLeaveZone(), OutdoorPvPTF::HandlePlayerLeaveZone(), OutdoorPvPZM::HandlePlayerLeaveZone(), spell_gen_consume::HandleProc(), spell_pri_t4_4p_bonus::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), spell_icc_harvest_blight_specimen::HandleQuestComplete(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleRemove(), spell_dru_enrage::HandleRemove(), spell_pal_divine_intervention::HandleRemove(), spell_pal_avenging_wrath::HandleRemove(), spell_rog_killing_spree_aura::HandleRemove(), spell_warr_vigilance::HandleRemove(), WorldSession::HandleRemoveGlyph(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_putricide_clear_aura_effect_value::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_jump_remove_aura::HandleScript(), spell_icc_harvest_blight_specimen::HandleScript(), spell_festergut_pungent_blight::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_q10651_q10692_book_of_fel_names::HandleScript(), spell_halion_clear_debuffs::HandleScriptEffect(), spell_q12823_remove_collapsing_cave_aura::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), spell_capacitus_polarity_charge::HandleTargets(), misc_commandscript::HandleUnAuraCommand(), misc_commandscript::HandleUnFreezeCommand(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), npc_underbog_mushroom::InitializeAI(), npc_demon_chain::JustDied(), boss_azuregos::boss_azuregosAI::JustDied(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::JustDied(), boss_bronjahm::boss_bronjahmAI::JustEngagedWith(), boss_doomwalker::JustEngagedWith(), boss_gruul::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_buru::JustEngagedWith(), boss_gal_darah::boss_gal_darahAI::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_hydross_the_unstable::JustReachedHome(), boss_garfrost::boss_garfrostAI::MovementInform(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::MovementInform(), boss_felmyst::boss_felmystAI::MovementInform(), boss_shade_of_akama::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), spell_halion_twilight_realm_aura::OnApply(), spell_halion_leave_twilight_realm_aura::OnApply(), spell_systems_shutdown_aura::OnApply(), npc_chesspiece::OnCharmed(), npc_eye_of_acherus::OnCharmed(), npc_aged_dying_ancient_kodo::OnGossipHello(), lfg::LFGPlayerScript::OnMapChanged(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_gen_curse_of_pain::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), BattlefieldWG::OnPlayerLeaveZone(), boss_shade_of_aran::OnPowerUpdate(), spell_halion_combustion_consumption_aura::OnRemove(), spell_halion_leave_twilight_realm_aura::OnRemove(), spell_algalon_phase_punch_aura::OnRemove(), spell_load_into_catapult_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), spell_hun_ascpect_of_the_viper::OnRemove(), spell_hun_viper_attack_speed::OnRemove(), spell_item_with_mount_speed::OnRemove(), spell_item_desperate_defense::OnRemove(), spell_item_shadowmourne::OnRemove(), spell_item_shadowmourne_soul_fragment::OnRemove(), spell_mage_combustion_proc::OnRemove(), spell_item_shadowmourne_soul_fragment::OnStackChange(), MidsummerPlayerScript::OnUpdateZone(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::PassengerBoarded(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::PassengerBoarded(), boss_jeklik::PathEndReached(), ProcessTerrainStatusUpdate(), spell_gen_defend::RefreshVisualShields(), RemoveAurasDueToSpellByDispel(), BattlefieldWG::RemoveAurasFromPlayer(), boss_festergut::boss_festergutAI::RemoveBlight(), spell_warl_health_funnel::RemoveEffect(), RemoveGameObject(), BattlegroundAV::RemovePlayer(), Battleground::RemovePlayerFromResurrectQueue(), boss_keristrasza::boss_keristraszaAI::RemovePrison(), Pet::removeSpell(), Player::removeSpell(), spell_gen_eject_all_passengers::RemoveVehicleAuras(), spell_gen_defend::RemoveVisualShields(), boss_malchezaar::Reset(), npc_mograine::npc_mograineAI::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), boss_twilight_corrupter::Reset(), boss_nalorakk::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_thekal::Reset(), boss_cthun::Reset(), boss_viscidus::Reset(), boss_halion::boss_halionAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_leotheras_the_blind::Reset(), boss_lethon::boss_lethonAI::Reset(), boss_taerar::boss_taerarAI::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), Player::ResurrectPlayer(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_magtheridon::ScheduleCombatEvents(), boss_supremus::SchedulePhase(), boss_laj::ScheduleTasks(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), OPvPCapturePointZM_GraveYard::SetBeaconState(), boss_hydross_the_unstable::SetForm(), Player::SetGMVisible(), boss_mandokir::boss_mandokirAI::SetGUID(), Player::SetIsSpectator(), SetModelVisible(), npc_akama_shade::sGossipSelect(), boss_nalorakk::ShapeShift(), boss_viscidus::SoftReset(), boss_ossirian::SpellHit(), npc_omen::npc_omenAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), boss_moorabi::boss_moorabiAI::SpellHitTarget(), boss_festergut::boss_festergutAI::SpellHitTarget(), boss_ahune::Submerge(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_cthun::SummonedCreatureDies(), npc_kiljaeden_controller::npc_kiljaeden_controllerAI::SummonedCreatureDies(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonedCreatureDies(), boss_anzu::SummonedCreatureDies(), boss_viscidus::SummonedCreatureDies(), boss_terestian_illhoof::SummonKilrek(), Player::SummonPet(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), boss_netherspite::SwitchToBanishPhase(), boss_netherspite::SwitchToPortalPhase(), Totem::UnSummon(), spell_black_temple_spell_absorption_aura::Update(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_eye_of_acherus::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_singularity::npc_singularityAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_moam::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_anzu::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_darting_hatchling::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ RemoveAurasDueToSpellByDispel()

void Unit::RemoveAurasDueToSpellByDispel ( uint32  spellId,
uint32  dispellerSpellId,
ObjectGuid  casterGUID,
Unit dispeller,
uint8  chargesRemoved = 1 
)
4943{
4944 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4945 for (AuraMap::iterator iter = range.first; iter != range.second;)
4946 {
4947 Aura* aura = iter->second;
4948 if (aura->GetCasterGUID() == casterGUID)
4949 {
4950 DispelInfo dispelInfo(dispeller, dispellerSpellId, chargesRemoved);
4951
4952 // Call OnDispel hook on AuraScript
4953 aura->CallScriptDispel(&dispelInfo);
4954
4956 aura->ModCharges(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
4957 else
4958 aura->ModStackAmount(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
4959
4960 // Call AfterDispel hook on AuraScript
4961 aura->CallScriptAfterDispel(&dispelInfo);
4962
4963 switch (aura->GetSpellInfo()->SpellFamilyName)
4964 {
4965 case SPELLFAMILY_HUNTER:
4966 {
4967 // Noxious Stings
4968 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x1000)
4969 {
4970 if (Unit* caster = aura->GetCaster())
4971 {
4972 if (AuraEffect* aureff = caster->GetAuraEffect(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_HUNTER, 3521, 1))
4973 {
4974 if (Aura* noxious = Aura::TryCreate(aura->GetSpellInfo(), aura->GetEffectMask(), dispeller, caster))
4975 {
4976 noxious->SetDuration(aura->GetDuration() * aureff->GetAmount() / 100);
4977 if (aura->GetUnitOwner())
4978 if (const std::vector<int32>* spell_triggered = sSpellMgr->GetSpellLinked(-int32(aura->GetId())))
4979 for (std::vector<int32>::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr)
4980 aura->GetUnitOwner()->RemoveAurasDueToSpell(*itr);
4981 }
4982 }
4983 }
4984 }
4985 break;
4986 }
4988 {
4989 // Icy Clutch, remove with Frost Fever
4990 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x4000000)
4991 {
4992 if (AuraEffect* aureff = GetAuraEffect(SPELL_AURA_MOD_DECREASE_SPEED, SPELLFAMILY_DEATHKNIGHT, 0, 0x40000, 0, casterGUID))
4993 RemoveAurasDueToSpell(aureff->GetId());
4994 }
4995 }
4996 default:
4997 break;
4998 }
4999 return;
5000 }
5001 else
5002 ++iter;
5003 }
5004}
Definition: Unit.h:296
void CallScriptDispel(DispelInfo *dispelInfo)
Definition: SpellAuras.cpp:2390
static Aura * TryCreate(SpellInfo const *spellproto, uint8 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemGUID=ObjectGuid::Empty)
Definition: SpellAuras.cpp:352
bool ModCharges(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: SpellAuras.cpp:973
void CallScriptAfterDispel(DispelInfo *dispelInfo)
Definition: SpellAuras.cpp:2403

References AURA_REMOVE_BY_ENEMY_SPELL, Aura::CallScriptAfterDispel(), Aura::CallScriptDispel(), GetAuraEffect(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetDuration(), Aura::GetEffectMask(), Aura::GetId(), DispelInfo::GetRemovedCharges(), Aura::GetSpellInfo(), Aura::GetUnitOwner(), SpellInfo::HasAttribute(), m_ownedAuras, Aura::ModCharges(), Aura::ModStackAmount(), RemoveAurasDueToSpell(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, sSpellMgr, and Aura::TryCreate().

Referenced by Spell::EffectDispel().

◆ RemoveAurasDueToSpellBySteal()

void Unit::RemoveAurasDueToSpellBySteal ( uint32  spellId,
ObjectGuid  casterGUID,
Unit stealer 
)
5007{
5008 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5009 for (AuraMap::iterator iter = range.first; iter != range.second;)
5010 {
5011 Aura* aura = iter->second;
5012 if (aura->GetCasterGUID() == casterGUID)
5013 {
5014 int32 damage[MAX_SPELL_EFFECTS];
5015 int32 baseDamage[MAX_SPELL_EFFECTS];
5016 uint8 effMask = 0;
5017 uint8 recalculateMask = 0;
5018 Unit* caster = aura->GetCaster();
5019 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5020 {
5021 if (aura->GetEffect(i))
5022 {
5023 baseDamage[i] = aura->GetEffect(i)->GetBaseAmount();
5024 damage[i] = aura->GetEffect(i)->GetAmount();
5025 effMask |= (1 << i);
5026 if (aura->GetEffect(i)->CanBeRecalculated())
5027 recalculateMask |= (1 << i);
5028 }
5029 else
5030 {
5031 baseDamage[i] = 0;
5032 damage[i] = 0;
5033 }
5034 }
5035
5037 // Cast duration to unsigned to prevent permanent aura's such as Righteous Fury being permanently added to caster
5038 uint32 dur = std::min(2u * MINUTE * IN_MILLISECONDS, uint32(aura->GetDuration()));
5039
5040 if (Aura* oldAura = stealer->GetAura(aura->GetId(), aura->GetCasterGUID()))
5041 {
5042 if (stealCharge)
5043 oldAura->ModCharges(1);
5044 else
5045 oldAura->ModStackAmount(1);
5046 oldAura->SetDuration(int32(dur));
5047 }
5048 else
5049 {
5050 // single target state must be removed before aura creation to preserve existing single target aura
5051 if (aura->IsSingleTarget())
5052 aura->UnregisterSingleTarget();
5053
5054 // Xinef: if stealer has same aura
5055 Aura* curAura = stealer->GetAura(aura->GetId());
5056 if (!curAura || (!curAura->IsPermanent() && curAura->GetDuration() < (int32)dur))
5057 if (Aura* newAura = Aura::TryRefreshStackOrCreate(aura->GetSpellInfo(), effMask, stealer, nullptr, &baseDamage[0], nullptr, aura->GetCasterGUID()))
5058 {
5059 // created aura must not be single target aura,, so stealer won't loose it on recast
5060 if (newAura->IsSingleTarget())
5061 {
5062 newAura->UnregisterSingleTarget();
5063 // bring back single target aura status to the old aura
5064 aura->SetIsSingleTarget(true);
5065 caster->GetSingleCastAuras().push_back(aura);
5066 }
5067 // FIXME: using aura->GetMaxDuration() maybe not blizzlike but it fixes stealing of spells like Innervate
5068 newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);
5069 newAura->ApplyForTargets();
5070 }
5071 }
5072
5073 if (stealCharge)
5075 else
5077
5078 return;
5079 }
5080 else
5081 ++iter;
5082 }
5083}
bool CanBeRecalculated() const
Definition: SpellAuraEffects.h:78
int32 GetBaseAmount() const
Definition: SpellAuraEffects.h:57
void UnregisterSingleTarget()
Definition: SpellAuras.cpp:1167
bool IsPermanent() const
Definition: SpellAuras.h:139

References AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::CanBeRecalculated(), AuraEffect::GetAmount(), GetAura(), AuraEffect::GetBaseAmount(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetCharges(), Aura::GetDuration(), Aura::GetEffect(), Aura::GetId(), Aura::GetMaxDuration(), GetSingleCastAuras(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), IN_MILLISECONDS, Aura::IsPermanent(), Aura::IsSingleTarget(), m_ownedAuras, MAX_SPELL_EFFECTS, MINUTE, Aura::ModCharges(), Aura::ModStackAmount(), Aura::SetIsSingleTarget(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, Aura::TryRefreshStackOrCreate(), and Aura::UnregisterSingleTarget().

Referenced by Spell::EffectStealBeneficialBuff().

◆ RemoveAurasWithAttribute()

void Unit::RemoveAurasWithAttribute ( uint32  flags)
5134{
5135 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5136 {
5137 SpellInfo const* spell = iter->second->GetBase()->GetSpellInfo();
5138 if (spell->Attributes & flags)
5139 RemoveAura(iter);
5140 else
5141 ++iter;
5142 }
5143}

References SpellInfo::Attributes, m_appliedAuras, and RemoveAura().

◆ RemoveAurasWithFamily()

void Unit::RemoveAurasWithFamily ( SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID 
)
5217{
5218 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5219 {
5220 Aura const* aura = iter->second->GetBase();
5221 if (!casterGUID || aura->GetCasterGUID() == casterGUID)
5222 {
5223 SpellInfo const* spell = aura->GetSpellInfo();
5224 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5225 {
5226 RemoveAura(iter);
5227 continue;
5228 }
5229 }
5230 ++iter;
5231 }
5232}

References Aura::GetCasterGUID(), Aura::GetSpellInfo(), flag96::HasFlag(), m_appliedAuras, RemoveAura(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by spell_warl_demonic_aegis::HandleAuraApply(), and Aura::HandleAuraSpecificMods().

◆ RemoveAurasWithInterruptFlags()

void Unit::RemoveAurasWithInterruptFlags ( uint32  flag,
uint32  except = 0,
bool  isAutoshot = false 
)
5182{
5183 if (!(m_interruptMask & flag))
5184 return;
5185
5186 // interrupt auras
5187 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end();)
5188 {
5189 Aura* aura = (*iter)->GetBase();
5190 ++iter;
5191 if ((aura->GetSpellInfo()->AuraInterruptFlags & flag) && (!except || aura->GetId() != except))
5192 {
5193 uint32 removedAuras = m_removedAurasCount;
5194 RemoveAura(aura);
5195 if (m_removedAurasCount > removedAuras + 1)
5196 iter = m_interruptableAuras.begin();
5197 }
5198 }
5199
5200 // interrupt channeled spell
5202 {
5203 if (spell->getState() == SPELL_STATE_CASTING && (spell->m_spellInfo->ChannelInterruptFlags & flag) && spell->m_spellInfo->Id != except)
5204 {
5205 // Do not interrupt if auto shot
5206 if (!(isAutoshot && spell->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS)))
5207 {
5208 InterruptNonMeleeSpells(false, spell->m_spellInfo->Id);
5209 }
5210 }
5211 }
5212
5214}

References SpellInfo::AuraInterruptFlags, CURRENT_CHANNELED_SPELL, Aura::GetId(), Aura::GetSpellInfo(), InterruptNonMeleeSpells(), m_currentSpells, m_interruptableAuras, m_interruptMask, m_removedAurasCount, RemoveAura(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_CASTING, and UpdateInterruptMask().

Referenced by _EnterVehicle(), AttackerStateUpdate(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealDamage(), Dismount(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundAB::EventPlayerClickedOnFlag(), spell_rog_killing_spree::FilterTargets(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleFeignDeath(), WorldSession::HandleGossipHelloOpcode(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModStealth(), AuraEffect::HandleModUnattackable(), WorldSession::HandleMovementOpcodes(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePhase(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), Mount(), Spell::prepare(), ProcessTerrainStatusUpdate(), Player::SetInWater(), SetStandState(), Player::TeleportTo(), and UpdatePosition().

◆ RemoveAurasWithMechanic()

void Unit::RemoveAurasWithMechanic ( uint32  mechanic_mask,
AuraRemoveMode  removemode = AURA_REMOVE_BY_DEFAULT,
uint32  except = 0 
)
5254{
5255 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5256 {
5257 Aura const* aura = iter->second->GetBase();
5258 if (!except || aura->GetId() != except)
5259 {
5260 if (aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask)
5261 {
5262 RemoveAura(iter, removemode);
5263 continue;
5264 }
5265 }
5266 ++iter;
5267 }
5268}

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetId(), Aura::GetSpellInfo(), m_appliedAuras, and RemoveAura().

Referenced by HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_rog_vanish_purge::HandleRootRemove(), spell_rog_vanish_purge::HandleSnareRemove(), and RemoveMovementImpairingAuras().

◆ RemoveBindSightAuras()

void Unit::RemoveBindSightAuras ( )
11179{
11181}
@ SPELL_AURA_BIND_SIGHT
Definition: SpellAuraDefines.h:64

References RemoveAurasByType(), and SPELL_AURA_BIND_SIGHT.

Referenced by RemoveFromWorld().

◆ RemoveCharmAuras()

void Unit::RemoveCharmAuras ( )
11184{
11189}
@ SPELL_AURA_MOD_POSSESS_PET
Definition: SpellAuraDefines.h:191
@ SPELL_AURA_MOD_CHARM
Definition: SpellAuraDefines.h:69
@ SPELL_AURA_AOE_CHARM
Definition: SpellAuraDefines.h:240
@ SPELL_AURA_MOD_POSSESS
Definition: SpellAuraDefines.h:65

References RemoveAurasByType(), SPELL_AURA_AOE_CHARM, SPELL_AURA_MOD_CHARM, SPELL_AURA_MOD_POSSESS, and SPELL_AURA_MOD_POSSESS_PET.

Referenced by misc_commandscript::HandleUnPossessCommand(), RemoveAllControlled(), RemoveFromWorld(), and Creature::Update().

◆ RemoveCharmedBy()

void Unit::RemoveCharmedBy ( Unit charmer)
18540{
18541 if (!IsCharmed())
18542 return;
18543
18544 if (!charmer)
18545 charmer = GetCharmer();
18546 if (charmer != GetCharmer()) // one aura overrides another?
18547 {
18548 // LOG_FATAL("entities.unit", "Unit::RemoveCharmedBy: this: {} true charmer: {} false charmer: {}",
18549 // GetGUID().ToString(), GetCharmerGUID().ToString(), charmer->GetGUID().ToString());
18550 // ABORT();
18551 return;
18552 }
18553
18554 CharmType type;
18556 type = CHARM_TYPE_POSSESS;
18557 else if (charmer && charmer->IsOnVehicle(this))
18558 type = CHARM_TYPE_VEHICLE;
18559 else
18560 type = CHARM_TYPE_CHARM;
18561
18562 if (_oldFactionId)
18563 {
18565 _oldFactionId = 0;
18566 }
18567 else
18569
18570 CastStop();
18571 AttackStop();
18572
18573 // xinef: update speed after charming
18574 UpdateSpeed(MOVE_RUN, false);
18575
18576 // xinef: do not break any controlled motion slot
18577 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE)
18578 {
18579 StopMoving();
18581 }
18582 // xinef: if we have any controlled movement, clear active and idle only
18583 else
18585
18587
18588 // xinef: remove stunned flag if owner was mounted
18591
18592 // If charmer still exists
18593 if (!charmer)
18594 return;
18595
18596 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18597 ASSERT(type != CHARM_TYPE_VEHICLE || (IsCreature() && IsVehicle()));
18598
18599 charmer->SetCharm(this, false);
18600
18602
18603 Player* playerCharmer = charmer->ToPlayer();
18604 if (playerCharmer)
18605 {
18606 switch (type)
18607 {
18608 case CHARM_TYPE_VEHICLE:
18609 playerCharmer->SetClientControl(this, false);
18610 playerCharmer->SetClientControl(charmer, true); // verified
18613 break;
18614 case CHARM_TYPE_POSSESS:
18615 playerCharmer->SetClientControl(this, false);
18616 playerCharmer->SetClientControl(charmer, true); // verified
18621 break;
18622 case CHARM_TYPE_CHARM:
18624 {
18626 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18627 {
18629 if (GetCharmInfo())
18630 GetCharmInfo()->SetPetNumber(0, true);
18631 else
18632 LOG_ERROR("entities.unit", "Aura::HandleModCharm: target={} has a charm aura but no charm info!", GetGUID().ToString());
18633 }
18634 }
18635 break;
18636 default:
18637 break;
18638 }
18639 }
18640
18641 if (Player* player = ToPlayer())
18642 {
18643 sScriptMgr->AnticheatSetUnderACKmount(player);
18644 }
18645
18646 // xinef: restore threat
18647 for (CharmThreatMap::const_iterator itr = _charmThreatInfo.begin(); itr != _charmThreatInfo.end(); ++itr)
18648 {
18649 if (Unit* target = ObjectAccessor::GetUnit(*this, itr->first))
18650 if (!IsFriendlyTo(target))
18651 AddThreat(target, itr->second);
18652 }
18653
18654 _charmThreatInfo.clear();
18655
18656 if (Creature* creature = ToCreature())
18657 {
18658 // Vehicle should not attack its passenger after he exists the seat
18659 if (type != CHARM_TYPE_VEHICLE && charmer->IsAlive() && !charmer->IsFriendlyTo(creature))
18660 if (Attack(charmer, true))
18661 GetMotionMaster()->MoveChase(charmer);
18662
18663 // Creature will restore its old AI on next update
18664 if (creature->AI())
18665 creature->AI()->OnCharmed(false);
18666
18667 // Xinef: Remove movement flag flying
18669 }
18670 else
18671 ToPlayer()->SetClientControl(this, true); // verified
18672
18673 // a guardian should always have charminfo
18674 if (playerCharmer && this != charmer->GetFirstControlled())
18675 playerCharmer->SendRemoveControlBar();
18676
18677 // xinef: Always delete charm info (restores react state)
18678 if (IsPlayer() || (IsCreature() && !ToCreature()->IsGuardian()))
18680}
CharmType
Definition: CharmInfo.h:43
@ CHARM_TYPE_CHARM
Definition: CharmInfo.h:44
@ CHARM_TYPE_POSSESS
Definition: CharmInfo.h:45
@ CHARM_TYPE_VEHICLE
Definition: CharmInfo.h:46
@ CLASS_CONTEXT_PET_CHARM
Definition: UnitDefines.h:216
@ UNIT_STATE_NO_ENVIRONMENT_UPD
Definition: UnitDefines.h:177
@ MOVE_RUN
Definition: UnitDefines.h:329
@ UNIT_FLAG_DISABLE_MOVE
Definition: UnitDefines.h:231
@ MOTION_SLOT_CONTROLLED
Definition: MotionMaster.h:63
@ MOTION_SLOT_ACTIVE
Definition: MotionMaster.h:62
@ NULL_MOTION_TYPE
Definition: MotionMaster.h:56
@ CREATURE_TYPE_DEMON
Definition: SharedDefines.h:2630
uint32 unit_class
Definition: CreatureData.h:214
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition: Object.cpp:750
void SendRemoveControlBar()
Definition: Player.cpp:9697
void SetClientControl(Unit *target, bool allowMove, bool packetOnly=false)
Definition: Player.cpp:12857
void DeleteCharmInfo()
Definition: Unit.cpp:15806
void RestoreFaction()
Definition: Unit.cpp:18682
void SetCharm(Unit *target, bool apply)
Definition: Unit.cpp:10862
void StopAttackingInvalidTarget()
Definition: Unit.cpp:20190
void CastStop(uint32 except_spellid=0, bool withInstant=true)
Interrupt the unit cast for all the current spells.
Definition: Unit.cpp:1160
bool Attack(Unit *victim, bool meleeAttack)
Definition: Unit.cpp:10263
CharmThreatMap _charmThreatInfo
Definition: Unit.h:1913
void RemoveUnitMovementFlag(uint32 f)
Definition: Unit.h:1626
void UpdateSpeed(UnitMoveType mtype, bool forced)
Definition: Unit.cpp:14236
void InitDefault()
Definition: MotionMaster.cpp:87
void MovementExpiredOnSlot(MovementSlot slot, bool reset=true)
Definition: MotionMaster.h:192
void MovementExpired(bool reset=true)
Definition: MotionMaster.h:178

References _charmThreatInfo, _oldFactionId, AddThreat(), ASSERT, Attack(), AttackStop(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, CLASS_CONTEXT_PET_CHARM, CLASS_WARLOCK, ClearUnitState(), CREATURE_TYPE_DEMON, DeleteCharmInfo(), GetCharmer(), GetCharmInfo(), Creature::GetCreatureTemplate(), GetFirstControlled(), Object::GetGUID(), GetMotionMaster(), ObjectAccessor::GetUnit(), HasUnitState(), MotionMaster::InitDefault(), IsAlive(), IsCharmed(), IsClass(), Object::IsCreature(), IsFriendlyTo(), IsGuardian(), IsOnVehicle(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MOTION_SLOT_ACTIVE, MOTION_SLOT_CONTROLLED, MOVE_RUN, MotionMaster::MoveChase(), MotionMaster::MovementExpired(), MotionMaster::MovementExpiredOnSlot(), MOVEMENTFLAG_FLYING, NULL_MOTION_TYPE, RemoveUnitFlag(), RemoveUnitMovementFlag(), RestoreFaction(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), sScriptMgr, StopAttackingInvalidTarget(), StopMoving(), Object::ToCreature(), Object::ToPlayer(), Position::ToString(), CreatureTemplate::type, CreatureTemplate::unit_class, UNIT_FIELD_BYTES_0, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_FLAG_STUNNED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, UNIT_STATE_STUNNED, and UpdateSpeed().

Referenced by AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), npc_chesspiece::JustDied(), Puppet::RemoveFromWorld(), Vehicle::RemovePassenger(), and npc_chesspiece::sGossipSelect().

◆ RemoveComboPointHolder()

void Unit::RemoveComboPointHolder ( Unit unit)
inline
1653{ m_ComboPointHolders.erase(unit); }

References m_ComboPointHolders.

Referenced by AddComboPoints(), and ClearComboPoints().

◆ RemoveDynObject()

bool Unit::RemoveDynObject ( uint32  spellId)
6142{
6143 if (m_dynObj.empty())
6144 return false;
6145
6146 bool result = false;
6147 for (DynObjectList::iterator i = m_dynObj.begin(); i != m_dynObj.end();)
6148 {
6149 DynamicObject* dynObj = *i;
6150 if (dynObj->GetSpellId() == spellId)
6151 {
6152 dynObj->Remove();
6153 i = m_dynObj.begin();
6154 result = true;
6155 }
6156 else
6157 ++i;
6158 }
6159
6160 return result;
6161}
void Remove()
Definition: DynamicObject.cpp:185

References DynamicObject::GetSpellId(), m_dynObj, and DynamicObject::Remove().

Referenced by Spell::cancel(), Spell::EffectAddFarsight(), and spell_item_shifting_naaru_silver::OnBaseRemove().

◆ RemoveEvadeAuras()

void Unit::RemoveEvadeAuras ( )
5438{
5439 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5440 {
5441 Aura const* aura = iter->second->GetBase();
5442 SpellInfo const* spellInfo = aura->GetSpellInfo();
5444 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5445 ++iter;
5446 else
5448 }
5449
5450 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5451 {
5452 Aura* aura = iter->second;
5453 SpellInfo const* spellInfo = aura->GetSpellInfo();
5455 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5456 ++iter;
5457 else
5459 }
5460}
@ SPELL_ATTR0_CU_IGNORE_EVADE
Definition: SpellInfo.h:187
@ SPELL_AURA_CLONE_CASTER
Definition: SpellAuraDefines.h:310
@ SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT
Definition: SharedDefines.h:444

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, GetOwnerGUID(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), Aura::IsPassive(), Object::IsPlayer(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CLONE_CASTER, and SPELL_AURA_CONTROL_VEHICLE.

Referenced by CreatureAI::_EnterEvadeMode(), and npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode().

◆ RemoveExtraUnitMovementFlag()

void Unit::RemoveExtraUnitMovementFlag ( uint16  f)
inline

◆ removeFollower()

void Unit::removeFollower ( FollowerReference )
inline
1613{ /* nothing to do yet */ }

Referenced by FollowerReference::targetObjectDestroyLink().

◆ RemoveFromWorld()

void Unit::RemoveFromWorld ( )
overridevirtual

Reimplemented from WorldObject.

15683{
15684 // cleanup
15685 ASSERT(GetGUID());
15686
15687 if (IsInWorld())
15688 {
15690 if (IsVehicle())
15692
15696
15699
15700 ExitVehicle(); // Remove applied auras with SPELL_AURA_CONTROL_VEHICLE
15703
15705
15706 if (GetCharmerGUID())
15707 {
15708 LOG_FATAL("entities.unit", "Unit {} has charmer guid when removed from world", GetEntry());
15709 ABORT();
15710 }
15711
15712 if (Unit* owner = GetOwner())
15713 {
15714 if (owner->m_Controlled.find(this) != owner->m_Controlled.end())
15715 {
15717 owner->SetMinion((Minion*)this, false);
15718 LOG_INFO("entities.unit", "Unit {} is in controlled list of {} when removed from world", GetEntry(), owner->GetEntry());
15719 //ABORT();
15720 }
15721 }
15722
15725 }
15726}
void RemoveFromWorld() override
Definition: Object.cpp:1182
void RemoveNotOwnSingleTargetAuras()
Definition: Unit.cpp:5145
void UnsummonAllTotems(bool onDeath=false)
Definition: Unit.cpp:11191
void RemoveAllDynObjects()
Definition: Unit.cpp:6163
void RemoveAreaAurasDueToLeaveWorld()
Definition: Unit.cpp:5286
void RemoveBindSightAuras()
Definition: Unit.cpp:11178
void RemoveAllControlled(bool onDeath=false)
Definition: Unit.cpp:11072

References ABORT, ASSERT, ExitVehicle(), GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwner(), HasUnitTypeMask(), Object::IsInWorld(), IsVehicle(), LOG_FATAL, LOG_INFO, m_duringRemoveFromWorld, RemoveAllControlled(), RemoveAllDynObjects(), RemoveAllGameObjects(), RemoveAreaAurasDueToLeaveWorld(), RemoveBindSightAuras(), RemoveCharmAuras(), WorldObject::RemoveFromWorld(), RemoveNotOwnSingleTargetAuras(), RemoveVehicleKit(), UNIT_MASK_GUARDIAN, UNIT_MASK_MINION, and UnsummonAllTotems().

Referenced by CleanupBeforeRemoveFromMap(), Creature::RemoveFromWorld(), Pet::RemoveFromWorld(), and Player::RemoveFromWorld().

◆ RemoveGameObject() [1/2]

void Unit::RemoveGameObject ( GameObject gameObj,
bool  del 
)
6198{
6199 if (!gameObj || gameObj->GetOwnerGUID() != GetGUID())
6200 return;
6201
6203
6204 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
6205 {
6206 if (m_ObjectSlot[i] == gameObj->GetGUID())
6207 {
6208 m_ObjectSlot[i].Clear();
6209 break;
6210 }
6211 }
6212
6213 // GO created by some spell
6214 if (uint32 spellid = gameObj->GetSpellId())
6215 {
6216 RemoveAurasDueToSpell(spellid);
6217
6218 if (IsPlayer())
6219 {
6220 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(spellid);
6221 // Need activate spell use for owner
6222 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6223 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6224 ToPlayer()->SendCooldownEvent(createBySpell);
6225 }
6226 }
6227
6228 m_gameObj.remove(gameObj->GetGUID());
6229
6230 if (del)
6231 {
6232 gameObj->SetRespawnTime(0);
6233 gameObj->Delete();
6234 }
6235}
void Clear()
Definition: ObjectGuid.h:138
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition: Player.cpp:11105

References ObjectGuid::Clear(), GameObject::Delete(), ObjectGuid::Empty, Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, m_ObjectSlot, MAX_GAMEOBJECT_SLOT, RemoveAurasDueToSpell(), Player::SendCooldownEvent(), GameObject::SetOwnerGUID(), GameObject::SetRespawnTime(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::cancel(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), Spell::EffectSummonObject(), gobject_commandscript::HandleGameObjectDeleteCommand(), spell_warl_demonic_circle_summon::HandleRemove(), boss_kologarn::boss_kologarnAI::JustDied(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::JustDied(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), GameObject::Update(), and npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI().

◆ RemoveGameObject() [2/2]

void Unit::RemoveGameObject ( uint32  spellid,
bool  del 
)
6238{
6239 if (m_gameObj.empty())
6240 return;
6241
6242 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
6243 {
6244 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6245 {
6246 if (spellid > 0 && go->GetSpellId() != spellid)
6247 {
6248 ++itr;
6249 continue;
6250 }
6251
6252 go->SetOwnerGUID(ObjectGuid::Empty);
6253 if (del)
6254 {
6255 go->SetRespawnTime(0);
6256 go->Delete();
6257 }
6258 }
6259 m_gameObj.erase(itr++);
6260 }
6261}

References ObjectGuid::Empty, ObjectAccessor::GetGameObject(), and m_gameObj.

◆ removeHatedBy()

void Unit::removeHatedBy ( HostileReference )
inline
842{ /* nothing to do yet */ }

Referenced by HostileReference::targetObjectDestroyLink().

◆ RemoveMovementImpairingAuras()

void Unit::RemoveMovementImpairingAuras ( bool  withRoot)
5235{
5236 if (withRoot)
5238
5239 // Snares
5240 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5241 {
5242 Aura const* aura = iter->second->GetBase();
5244 {
5245 RemoveAura(iter);
5246 continue;
5247 }
5248
5249 ++iter;
5250 }
5251}
bool HasEffectMechanic(Mechanics mechanic) const
Definition: SpellInfo.cpp:883

References Aura::GetSpellInfo(), SpellInfo::HasEffectMechanic(), m_appliedAuras, SpellInfo::Mechanic, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), and RemoveAurasWithMechanic().

Referenced by Spell::CheckCast(), Spell::EffectTriggerSpell(), HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), and spell_gen_remove_impairing_auras::HandleScriptEffect().

◆ RemoveNotOwnSingleTargetAuras()

void Unit::RemoveNotOwnSingleTargetAuras ( )
5146{
5147 // single target auras from other casters
5148 // Iterate m_ownedAuras - aura is marked as single target in Unit::AddAura (and pushed to m_ownedAuras).
5149 // m_appliedAuras will NOT contain the aura before first Unit::Update after adding it to m_ownedAuras.
5150 // Quickly removing such an aura will lead to it not being unregistered from caster's single cast auras container
5151 // leading to assertion failures if the aura was cast on a player that can
5152 // (and is changing map at the point where this function is called).
5153 // Such situation occurs when player is logging in inside an instance and fails the entry check for any reason.
5154 // The aura that was loaded from db (indirectly, via linked casts) gets removed before it has a chance
5155 // to register in m_appliedAuras
5156 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5157 {
5158 Aura const* aura = iter->second;
5159
5160 if (aura->GetCasterGUID() != GetGUID() && aura->IsSingleTarget())
5161 RemoveOwnedAura(iter);
5162 else
5163 ++iter;
5164 }
5165
5166 // single target auras at other targets
5167 AuraList& scAuras = GetSingleCastAuras();
5168 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
5169 {
5170 Aura* aura = *iter;
5171 if (aura->GetUnitOwner() != this)
5172 {
5173 aura->Remove();
5174 iter = scAuras.begin();
5175 }
5176 else
5177 ++iter;
5178 }
5179}

References Aura::GetCasterGUID(), Object::GetGUID(), GetSingleCastAuras(), Aura::GetUnitOwner(), Aura::IsSingleTarget(), m_ownedAuras, Aura::Remove(), and RemoveOwnedAura().

Referenced by RemoveFromWorld().

◆ RemoveNpcFlag()

void Unit::RemoveNpcFlag ( NPCFlags  flags)
inline
696{ RemoveFlag(UNIT_NPC_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), boss_vaelastrasz::boss_vaelAI::BeginSpeech(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_fos_leader::npc_fos_leaderAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_akama_illidan::DoAction(), spell_q12096_q12092_dummy::HandleDummy(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), npc_precious::npc_preciousAI::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), npc_fos_leader_second::npc_fos_leader_secondAI::npc_fos_leader_secondAI(), npc_pos_leader_second::npc_pos_leader_secondAI::npc_pos_leader_secondAI(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_announcer_toc10::OnGossipHello(), npc_hyjal_jaina::OnGossipSelect(), npc_hyjal_thrall::OnGossipSelect(), boss_doomrel::OnGossipSelect(), boss_majordomo::OnGossipSelect(), npc_zulaman_hostage::OnGossipSelect(), npc_arthas::OnGossipSelect(), npc_ulduar_keeper::OnGossipSelect(), npc_announcer_toc5::OnGossipSelect(), npc_announcer_toc10::OnGossipSelect(), npc_hor_leader::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_thrall_old_hillsbrad::OnGossipSelect(), npc_hor_leader_second::OnGossipSelect(), npc_battle_at_valhalas::OnQuestAccept(), npc_riggle_bassbait::OnQuestReward(), NPCStaveQuestAI::PrepareForEncounter(), RemoveVehicleKit(), boss_majordomo::boss_majordomoAI::Reset(), npc_arthas::npc_arthasAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), npc_xerestrasza::npc_xerestraszaAI::Reset(), npc_tirion_fordring_tft::npc_tirion_fordringAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_lake_frog::npc_lake_frogAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_magister_aledis::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::sGossipSelect(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::sGossipSelect(), boss_apothecary_hummel::boss_apothecary_hummelAI::sGossipSelect(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::npc_harrison_jonesAI::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_general_andorov::sGossipSelect(), npc_akama_shade::sGossipSelect(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_chesspiece::SpellHitTarget(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), dragonmaw_race_npc::sQuestAccept(), npc_magister_aledis::StartFight(), npc_cork_gizelton::npc_cork_gizeltonAI::SummonHelpers(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), and Vehicle::Vehicle().

◆ RemoveOwnedAura() [1/3]

void Unit::RemoveOwnedAura ( Aura aura,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4739{
4740 if (aura->IsRemoved())
4741 return;
4742
4743 ASSERT(aura->GetOwner() == this);
4744
4745 uint32 spellId = aura->GetId();
4746 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4747
4748 for (AuraMap::iterator itr = range.first; itr != range.second; ++itr)
4749 {
4750 if (itr->second == aura)
4751 {
4752 RemoveOwnedAura(itr, removeMode);
4753 return;
4754 }
4755 }
4756
4757 ABORT();
4758}

References ABORT, ASSERT, Aura::GetId(), Aura::GetOwner(), Aura::IsRemoved(), m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAura() [2/3]

void Unit::RemoveOwnedAura ( AuraMap::iterator &  i,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4706{
4707 Aura* aura = i->second;
4708 ASSERT(!aura->IsRemoved());
4709
4710 // if unit currently update aura list then make safe update iterator shift to next
4713
4714 m_ownedAuras.erase(i);
4715 m_removedAuras.push_back(aura);
4716
4717 // Unregister single target aura
4718 if (aura->IsSingleTarget())
4719 aura->UnregisterSingleTarget();
4720
4721 aura->_Remove(removeMode);
4722
4723 i = m_ownedAuras.begin();
4724}
void _Remove(AuraRemoveMode removeMode)
Definition: SpellAuras.cpp:574

References Aura::_Remove(), ASSERT, Aura::IsRemoved(), Aura::IsSingleTarget(), m_auraUpdateIterator, m_ownedAuras, m_removedAuras, and Aura::UnregisterSingleTarget().

Referenced by Player::_removeTalentAurasAndSpells(), _UpdateSpells(), Player::ActivateSpec(), Spell::EffectApplyGlyph(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandleRemoveGlyph(), AuraEffect::HandleShapeshiftBoosts(), spell_gen_animal_blood::OnApply(), spell_contagion_of_rot::OnApply(), UnitAura::Remove(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAurasDueToItemSpell(), RemoveEvadeAuras(), Player::RemoveItemDependentAurasAndCasts(), RemoveNotOwnSingleTargetAuras(), RemoveOwnedAura(), RemoveOwnedAuras(), Player::removeSpell(), boss_falric::boss_falricAI::UpdateAI(), and Player::UpdateAreaDependentAuras().

◆ RemoveOwnedAura() [3/3]

void Unit::RemoveOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4727{
4728 for (AuraMap::iterator itr = m_ownedAuras.lower_bound(spellId); itr != m_ownedAuras.upper_bound(spellId);)
4729 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask) && (!casterGUID || itr->second->GetCasterGUID() == casterGUID))
4730 {
4731 RemoveOwnedAura(itr, removeMode);
4732 itr = m_ownedAuras.lower_bound(spellId);
4733 }
4734 else
4735 ++itr;
4736}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [1/2]

void Unit::RemoveOwnedAuras ( std::function< bool(Aura const *)> const &  check)
4858{
4859 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
4860 {
4861 if (check(iter->second))
4862 {
4863 RemoveOwnedAura(iter);
4864 continue;
4865 }
4866 ++iter;
4867 }
4868}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [2/2]

void Unit::RemoveOwnedAuras ( uint32  spellId,
std::function< bool(Aura const *)> const &  check 
)
4884{
4885 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
4886 {
4887 if (check(iter->second))
4888 {
4889 RemoveOwnedAura(iter);
4890 continue;
4891 }
4892 ++iter;
4893 }
4894}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemovePetAura()

void Unit::RemovePetAura ( PetAura const *  petSpell)
17297{
17298 if (!IsPlayer())
17299 return;
17300
17301 m_petAuras.erase(petSpell);
17302 if (Pet* pet = ToPlayer()->GetPet())
17303 pet->RemoveAurasDueToSpell(petSpell->GetAura(pet->GetEntry()));
17304 if (Unit* charm = GetCharm())
17305 charm->RemoveAurasDueToSpell(petSpell->GetAura(charm->GetEntry()));
17306}

References PetAura::GetAura(), GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Player::_removeTalentAurasAndSpells(), Pet::CastPetAuras(), AuraEffect::HandleAuraDummy(), and Player::removeSpell().

◆ RemovePlayerFromVision()

void Unit::RemovePlayerFromVision ( Player player)
11168{
11169 m_sharedVision.remove(player);
11170 player->m_isInSharedVisionOf.erase(this);
11171 if (m_sharedVision.empty())
11172 {
11173 setActive(false);
11174 SetWorldObject(false);
11175 }
11176}

References Player::m_isInSharedVisionOf, m_sharedVision, WorldObject::setActive(), and WorldObject::SetWorldObject().

Referenced by Player::SetViewpoint(), and Player::~Player().

◆ RemovePointedBy()

void Unit::RemovePointedBy ( SafeUnitPointer sup)
inline

◆ RemoveStandFlags()

void Unit::RemoveStandFlags ( uint8  flags)
inline
@ UNIT_BYTES_1_OFFSET_VIS_FLAG
Definition: UnitDefines.h:25
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition: Object.cpp:930

References Object::RemoveByteFlag(), UNIT_BYTES_1_OFFSET_VIS_FLAG, and UNIT_FIELD_BYTES_1.

Referenced by AuraEffect::HandleModStealth(), Player::InitStatsForLevel(), and npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI().

◆ RemoveUnitFlag()

void Unit::RemoveUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

684{ RemoveFlag(UNIT_FIELD_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_FIELD_FLAGS.

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), Player::BuildPlayerRepop(), boss_thekal::CheckPhaseTransition(), Player::CleanupAfterTaxiFlight(), ClearInCombat(), ClearInPetCombat(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), Dismount(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_thekal::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_the_lurker_below::DoAction(), npc_frozen_core::DoAction(), boss_broggok::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_cthun::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DoAction(), boss_essence_of_desire::boss_essence_of_desireAI::DoAction(), boss_essence_of_anger::boss_essence_of_angerAI::DoAction(), boss_kelidan_the_breaker::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), HomeMovementGenerator< Creature >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), WorldSession::DoLootRelease(), Spell::EffectResurrectPet(), Spell::EffectSkinning(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_bronjahm::boss_bronjahmAI::EnterEvadeMode(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), boss_kelthuzad::boss_kelthuzadAI::EnterEvadeMode(), boss_malygos::boss_malygosAI::EnterEvadeMode(), boss_ymiron::boss_ymironAI::EnterEvadeMode(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), SACActivateEvent::Execute(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::FeignDeath(), TimedFleeingMovementGenerator::Finalize(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_feign_death_all_flags::HandleEffectRemove(), spell_gen_feign_death_no_dyn_flag::HandleEffectRemove(), spell_gen_feign_death_no_prevent_emotes::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLogoutCancelOpcode(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), WorldSession::HandlePlayerLoginToCharInWorld(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_jarien::IsSummonedBy(), boss_sothos::IsSummonedBy(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), boss_volazj::JustDied(), boss_ichoron::boss_ichoronAI::JustDied(), boss_taerar::boss_taerarAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_ymiron::boss_ymironAI::JustEngagedWith(), boss_hazzarah::JustSummoned(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), boss_shade_of_akama::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_amanitar_mushrooms::npc_amanitar_mushrooms(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), npc_death_knight_initiate::OnGossipSelect(), npc_bessy::OnQuestAccept(), spell_halion_twilight_phasing_aura::OnRemove(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), RemoveCharmedBy(), Vehicle::RemovePassenger(), boss_keristrasza::boss_keristraszaAI::RemovePrison(), boss_lord_valthalak::boss_lord_valthalakAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_crone::Reset(), boss_julianne::Reset(), npc_mograine::npc_mograineAI::Reset(), boss_felmyst::boss_felmystAI::Reset(), boss_kalecgos::boss_kalecgosAI::Reset(), boss_muru::boss_muruAI::Reset(), boss_eye_of_cthun::Reset(), boss_volazj::Reset(), boss_anub_arak::boss_anub_arakAI::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_kelthuzad::boss_kelthuzadAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_crystalline_frayer::npc_crystalline_frayerAI::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_mimiron::boss_mimironAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::Reset(), boss_svala::boss_svalaAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), boss_ichoron::boss_ichoronAI::Reset(), npc_wounded_skirmisher::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), boss_leotheras_the_blind::Reset(), npc_shattered_hand_scout::Reset(), emerald_dragonAI::Reset(), npc_doctor::npc_doctorAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Resurrect(), boss_magtheridon::ScheduleCombatEvents(), boss_the_lurker_below::SchedulerPhaseTwo(), SetCharm(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SetData(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SetData(), Pet::setDeathState(), SetImmuneToNPC(), SetImmuneToPC(), Player::SetIsSpectator(), SetStunned(), SetSwim(), Battlefield::ShowNpc(), boss_zuljin::boss_zuljinAI::SpawnAdds(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SpellHit(), npc_ulduar_vx001::npc_ulduar_vx001AI::SpellHit(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SpellHit(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), boss_lord_valthalak::boss_lord_valthalakAI::StartFighting(), boss_noth::boss_nothAI::StartGroundPhase(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_crystalline_frayer::npc_crystalline_frayerAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached(), and npc_general_andorov::WaypointReached().

◆ RemoveUnitFlag2()

◆ RemoveUnitMovementFlag()

◆ RemoveVehicleKit()

void Unit::RemoveVehicleKit ( )
18715{
18716 if (!m_vehicleKit)
18717 return;
18718
18720 delete m_vehicleKit;
18721
18722 m_vehicleKit = nullptr;
18723
18724 m_updateFlag &= ~UPDATEFLAG_VEHICLE;
18725 m_unitTypeMask &= ~UNIT_MASK_VEHICLE;
18727}
@ UNIT_NPC_FLAG_SPELLCLICK
Definition: UnitDefines.h:318
@ UNIT_NPC_FLAG_PLAYER_VEHICLE
Definition: UnitDefines.h:319
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:696

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, RemoveNpcFlag(), Vehicle::Uninstall(), UNIT_NPC_FLAG_PLAYER_VEHICLE, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Dismount(), AuraEffect::HandleAuraSetVehicle(), npc_gunship::npc_gunshipAI::JustDied(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), and RemoveFromWorld().

◆ RemoveVisibleAura()

void Unit::RemoveVisibleAura ( uint8  slot)
inline
1513{ m_visibleAuras.erase(slot); UpdateAuraForGroup(slot);}
void UpdateAuraForGroup(uint8 slot)
Definition: Unit.cpp:17156

References m_visibleAuras, and UpdateAuraForGroup().

Referenced by AuraApplication::_Remove().

◆ ReplaceAllDynamicFlags()

◆ ReplaceAllNpcFlags()

void Unit::ReplaceAllNpcFlags ( NPCFlags  flags)
inline

References SetUInt32Value(), and UNIT_NPC_FLAGS.

Referenced by Pet::CreateBaseAtTamed(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), Spell::EffectSummonType(), SmartAI::EndPath(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFlagCommand(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_akama_illidan::JustSummoned(), Pet::LoadPetFromDB(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_shandy_dalaran::OnGossipSelect(), go_crystalline_tear::OnQuestAccept(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), boss_doomrel::boss_doomrelAI::Reset(), npc_eris_hevenfire::npc_eris_hevenfireAI::Reset(), npc_taretha::npc_tarethaAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Creature::setDeathState(), npc_eris_hevenfire::npc_eris_hevenfireAI::SetGUID(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_akama_illidan::sGossipSelect(), npc_escortAI::Start(), FollowerAI::StartFollow(), SmartAI::StartPath(), Player::SummonPet(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), Creature::UpdateEntry(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), and npc_captain_saeed::npc_captain_saeedAI::WaypointReached().

◆ ReplaceAllUnitFlags()

◆ ReplaceAllUnitFlags2()

void Unit::ReplaceAllUnitFlags2 ( UnitFlags2  flags)
inline

◆ resetAttackTimer()

◆ ResetRedirectThreat()

◆ RestoreDisplayId()

void Unit::RestoreDisplayId ( )
16763{
16764 AuraEffect* handledAura = nullptr;
16765 AuraEffect* handledAuraForced = nullptr;
16766 // try to receive model from transform auras
16768 if (!transforms.empty())
16769 {
16770 // iterate over already applied transform auras - from newest to oldest
16771 for (auto i = transforms.rbegin(); i != transforms.rend(); ++i)
16772 {
16773 if (AuraApplication const* aurApp = (*i)->GetBase()->GetApplicationOfTarget(GetGUID()))
16774 {
16775 if (!handledAura)
16776 handledAura = (*i);
16777 // xinef: prefer negative/forced auras
16778 if ((*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) || !aurApp->IsPositive())
16779 {
16780 handledAuraForced = (*i);
16781 break;
16782 }
16783 }
16784 }
16785 }
16786
16787 // Xinef: include clone auras (eg mirror images)
16788 if (!handledAuraForced && !handledAura)
16789 {
16791 if (!cloneAuras.empty())
16792 for (Unit::AuraEffectList::const_iterator i = cloneAuras.begin(); i != cloneAuras.end(); ++i)
16793 handledAura = *i;
16794 }
16795
16797
16798 // xinef: order of execution is important!
16799 // first forced transform auras, then shapeshifts, then normal transform
16800 // transform aura was found
16801 if (handledAuraForced)
16802 {
16803 handledAuraForced->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16804 return;
16805 }
16806 else if (!shapeshiftAura.empty()) // we've found shapeshift
16807 {
16808 // only one such aura possible at a time
16809 if (uint32 modelId = GetModelForForm(GetShapeshiftForm(), shapeshiftAura.front()->GetId()))
16810 {
16811 SetDisplayId(modelId);
16812 return;
16813 }
16814 }
16815 else if (handledAura)
16816 {
16817 handledAura->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16818 return;
16819 }
16820
16821 // no auras found - set modelid to default
16823}
@ SPELL_AURA_MOD_SHAPESHIFT
Definition: SpellAuraDefines.h:99
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition: SpellAuraDefines.h:43
uint32 GetModelForForm(ShapeshiftForm form, uint32 spellId) const
Definition: Unit.cpp:19187
void HandleEffect(AuraApplication *aurApp, uint8 mode, bool apply)
Definition: SpellAuraEffects.cpp:741

References AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Aura::GetApplicationOfTarget(), GetAuraEffectsByType(), AuraApplication::GetBase(), Object::GetGUID(), GetModelForForm(), GetNativeDisplayId(), GetShapeshiftForm(), AuraEffect::HandleEffect(), SetDisplayId(), SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_CLONE_CASTER, SPELL_AURA_MOD_SHAPESHIFT, and SPELL_AURA_TRANSFORM.

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), spell_gen_aura_service_uniform::OnRemove(), and Player::SetIsSpectator().

◆ RestoreFaction()

void Unit::RestoreFaction ( )
18683{
18684 if (IsPlayer())
18686 else
18687 {
18689 {
18690 if (Unit* owner = GetOwner())
18691 {
18692 SetFaction(owner->GetFaction());
18693 return;
18694 }
18695 }
18696
18697 if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate()) // normal creature
18698 SetFaction(cinfo->faction);
18699 }
18700}
void SetFactionForRace(uint8 race)
Definition: Player.cpp:5849

References GetOwner(), getRace(), HasUnitTypeMask(), Object::IsPlayer(), SetFaction(), Player::SetFactionForRace(), Object::ToCreature(), Object::ToPlayer(), and UNIT_MASK_MINION.

Referenced by npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thekal::DoAction(), AuraEffect::HandleAuraModFaction(), npc_commandscript::HandleNpcSetOriginalFaction(), npc_enslaved_netherwing_drake::JustDied(), npc_escortAI::JustRespawned(), SmartAI::JustRespawned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), RemoveCharmedBy(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_crusade_persuaded::npc_crusade_persuadedAI::Reset(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_ahnqiraji_critter::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_magister_aledis::Reset(), npc_captain_saeed::npc_captain_saeedAI::Reset(), npc_bessy::npc_bessyAI::Reset(), and npc_enslaved_netherwing_drake::Reset().

◆ ResumeMovement()

void Unit::ResumeMovement ( uint32  timer = 0,
uint8  slot = 0 
)
16668{
16669 if (slot >= MAX_MOTION_SLOT)
16670 return;
16671
16672 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16673 movementGenerator->Resume(timer);
16674}

References GetMotionMaster(), and MAX_MOTION_SLOT.

Referenced by boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight().

◆ RewardRage()

void Unit::RewardRage ( uint32  damage,
uint32  weaponSpeedHitFactor,
bool  attacker 
)
20124{
20125 // Rage formulae https://wowwiki-archive.fandom.com/wiki/Rage#Formulae
20126 float addRage;
20127
20128 float rageconversion = ((0.0091107836f * GetLevel() * GetLevel()) + 3.225598133f * GetLevel()) + 4.2652911f;
20129
20130 // Unknown if correct, but lineary adjust rage conversion above level 70
20131 if (GetLevel() > 70)
20132 rageconversion += 13.27f * (GetLevel() - 70);
20133
20134 if (attacker)
20135 {
20136 // see Bornak's bluepost explanation (05/29/2009)
20137 float rageFromDamageDealt = damage / rageconversion * 7.5f;
20138 addRage = (rageFromDamageDealt + weaponSpeedHitFactor) / 2.0f;
20139 addRage = std::min(addRage, rageFromDamageDealt * 2.0f);
20141 }
20142 else
20143 {
20144 addRage = damage / rageconversion * 2.5f;
20145
20146 // Berserker Rage effect
20147 if (HasAura(18499))
20148 addRage *= 3.0f;
20149 }
20150
20151 addRage *= sWorld->getRate(RATE_POWER_RAGE_INCOME);
20152
20153 ModifyPower(POWER_RAGE, uint32(addRage * 10));
20154}
@ SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT
Definition: SpellAuraDefines.h:276
@ RATE_POWER_RAGE_INCOME
Definition: IWorld.h:430

References AddPct(), GetLevel(), GetTotalAuraModifier(), HasAura(), ModifyPower(), POWER_RAGE, RATE_POWER_RAGE_INCOME, SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT, and sWorld.

Referenced by DealDamage(), and DealMeleeDamage().

◆ RollMeleeOutcomeAgainst() [1/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType 
) const
2782{
2783 // This is only wrapper
2784
2785 // Miss chance based on melee
2786 //float miss_chance = MeleeMissChanceCalc(victim, attType);
2787 float miss_chance = MeleeSpellMissChance(victim, attType, int32(GetWeaponSkillValue(attType, victim)) - int32(victim->GetMaxSkillValueForLevel(this)), 0);
2788
2789 // Critical hit chance
2790 float crit_chance = GetUnitCriticalChance(attType, victim);
2791 if (crit_chance < 0)
2792 crit_chance = 0;
2793
2794 float dodge_chance = victim->GetUnitDodgeChance();
2795 float block_chance = victim->GetUnitBlockChance();
2796 float parry_chance = victim->GetUnitParryChance();
2797
2798 // Useful if want to specify crit & miss chances for melee, else it could be removed
2799 //LOG_DEBUG("entities.unit", "MELEE OUTCOME: miss {} crit {} dodge {} parry {} block {}", miss_chance, crit_chance, dodge_chance, parry_chance, block_chance);
2800
2801 return RollMeleeOutcomeAgainst(victim, attType, int32(crit_chance * 100), int32(miss_chance * 100), int32(dodge_chance * 100), int32(parry_chance * 100), int32(block_chance * 100));
2802}
float GetUnitCriticalChance(WeaponAttackType attackType, Unit const *victim) const
Definition: Unit.cpp:3728

References GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetUnitCriticalChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), MeleeSpellMissChance(), and RollMeleeOutcomeAgainst().

Referenced by CalculateMeleeDamage(), and RollMeleeOutcomeAgainst().

◆ RollMeleeOutcomeAgainst() [2/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType,
int32  crit_chance,
int32  miss_chance,
int32  dodge_chance,
int32  parry_chance,
int32  block_chance 
) const
2805{
2806 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks())
2807 {
2808 return MELEE_HIT_EVADE;
2809 }
2810
2811 int32 attackerMaxSkillValueForLevel = GetMaxSkillValueForLevel(victim);
2812 int32 victimMaxSkillValueForLevel = victim->GetMaxSkillValueForLevel(this);
2813
2814 int32 attackerWeaponSkill = GetWeaponSkillValue(attType, victim);
2815 int32 victimDefenseSkill = victim->GetDefenseSkillValue(this);
2816
2817 sScriptMgr->OnBeforeRollMeleeOutcomeAgainst(this, victim, attType, attackerMaxSkillValueForLevel, victimMaxSkillValueForLevel, attackerWeaponSkill, victimDefenseSkill, crit_chance, miss_chance, dodge_chance, parry_chance, block_chance);
2818
2819 // bonus from skills is 0.04%
2820 int32 skillBonus = 4 * (attackerWeaponSkill - victimMaxSkillValueForLevel);
2821 int32 sum = 0, tmp = 0;
2822 int32 roll = urand (0, 10000);
2823
2824 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: skill bonus of {} for attacker", skillBonus);
2825 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: rolled {}, miss {}, dodge {}, parry {}, block {}, crit {}",
2826 // roll, miss_chance, dodge_chance, parry_chance, block_chance, crit_chance);
2827
2828 tmp = miss_chance;
2829
2830 if (tmp > 0 && roll < (sum += tmp))
2831 {
2832 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: MISS");
2833 return MELEE_HIT_MISS;
2834 }
2835
2836 // Dodge chance
2837
2838 // only players can't dodge if attacker is behind
2839 if (victim->IsPlayer() && !victim->HasInArc(M_PI, this) && !victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION))
2840 {
2841 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind and victim was a player.");
2842 }
2843 // Xinef: do not allow to dodge with CREATURE_FLAG_EXTRA_NO_DODGE flag
2844 else if (victim->IsPlayer() || !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_DODGE))
2845 {
2846 // Reduce dodge chance by attacker expertise rating
2847 if (IsPlayer())
2848 dodge_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2849 else
2850 dodge_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2851
2852 // Modify dodge chance by attacker SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
2854 dodge_chance = int32 (float (dodge_chance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
2855
2856 tmp = dodge_chance;
2857
2858 // xinef: if casting or stunned - cant dodge
2859 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2860 tmp = 0;
2861
2862 if ((tmp > 0) // check if unit _can_ dodge
2863 && ((tmp -= skillBonus) > 0)
2864 && roll < (sum += tmp))
2865 {
2866 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: DODGE <{}, {})", sum - tmp, sum);
2867 return MELEE_HIT_DODGE;
2868 }
2869 }
2870
2871 // parry & block chances
2872
2873 // check if attack comes from behind, nobody can parry or block if attacker is behind
2874 if (!victim->HasInArc(M_PI, this) && !victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION))
2875 {
2876 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind.");
2877 }
2878 else
2879 {
2880 // Reduce parry chance by attacker expertise rating
2881 if (IsPlayer())
2882 parry_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2883 else
2884 parry_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2885
2886 if (victim->IsPlayer() || !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_PARRY))
2887 {
2888 tmp = parry_chance;
2889
2890 // xinef: cant parry while casting or while stunned
2891 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2892 tmp = 0;
2893
2894 if (tmp > 0 // check if unit _can_ parry
2895 && (tmp -= skillBonus) > 0
2896 && roll < (sum += tmp))
2897 {
2898 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: PARRY <{}, {})", sum - tmp, sum);
2899 return MELEE_HIT_PARRY;
2900 }
2901 }
2902
2903 if (victim->IsPlayer() || !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK))
2904 {
2905 tmp = block_chance;
2906
2907 // xinef: cant block while casting or while stunned
2908 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2909 tmp = 0;
2910
2911 if (tmp > 0 // check if unit _can_ block
2912 && (tmp -= skillBonus) > 0
2913 && roll < (sum += tmp))
2914 {
2915 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: BLOCK <{}, {})", sum - tmp, sum);
2916 return MELEE_HIT_BLOCK;
2917 }
2918 }
2919 }
2920
2921 // Max 40% chance to score a glancing blow against mobs that are higher level (can do only players and pets and not with ranged weapon)
2922 if (attType != RANGED_ATTACK &&
2923 (IsPlayer() || IsPet()) &&
2924 !victim->IsPlayer() && !victim->IsPet() &&
2925 GetLevel() < victim->getLevelForTarget(this))
2926 {
2927 // cap possible value (with bonuses > max skill)
2928 int32 skill = attackerWeaponSkill;
2929 int32 maxskill = attackerMaxSkillValueForLevel;
2930 skill = (skill > maxskill) ? maxskill : skill;
2931
2932 tmp = (10 + (victimDefenseSkill - skill)) * 100;
2933 tmp = tmp > 4000 ? 4000 : tmp;
2934 if (roll < (sum += tmp))
2935 {
2936 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: GLANCING <{}, {})", sum - 4000, sum);
2937 return MELEE_HIT_GLANCING;
2938 }
2939 }
2940
2941 // mobs can score crushing blows if they're 4 or more levels above victim
2942 if (getLevelForTarget(victim) >= victim->getLevelForTarget(this) + 4 &&
2943 // can be from by creature (if can) or from controlled player that considered as creature
2945 !(IsCreature() && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS))
2946 {
2947 // when their weapon skill is 15 or more above victim's defense skill
2948 tmp = victimDefenseSkill;
2949 int32 tmpmax = victimMaxSkillValueForLevel;
2950 // having defense above your maximum (from items, talents etc.) has no effect
2951 tmp = tmp > tmpmax ? tmpmax : tmp;
2952 // tmp = mob's level * 5 - player's current defense skill
2953 tmp = attackerMaxSkillValueForLevel - tmp;
2954 if (tmp >= 15)
2955 {
2956 // add 2% chance per lacking skill point, min. is 15%
2957 tmp = tmp * 200 - 1500;
2958 if (roll < (sum += tmp))
2959 {
2960 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRUSHING <{}, {})", sum - tmp, sum);
2961 return MELEE_HIT_CRUSHING;
2962 }
2963 }
2964 }
2965
2966 // Critical chance
2967 tmp = crit_chance;
2968
2969 if (tmp > 0 && roll < (sum += tmp))
2970 {
2971 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT <{}, {})", sum - tmp, sum);
2972 if (IsCreature() && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRIT))
2973 {
2974 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT DISABLED)");
2975 }
2976 else
2977 return MELEE_HIT_CRIT;
2978 }
2979
2980 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: NORMAL");
2981 return MELEE_HIT_NORMAL;
2982}
@ CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS
Definition: CreatureData.h:51
@ CREATURE_FLAG_EXTRA_NO_CRIT
Definition: CreatureData.h:63

References CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_CRIT, CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), GetDefenseSkillValue(), GetLevel(), getLevelForTarget(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetWeaponSkillValue(), HasAuraType(), Position::HasInArc(), HasUnitState(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsNonMeleeSpellCast(), IsPet(), Object::IsPlayer(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, RANGED_ATTACK, SPELL_AURA_IGNORE_HIT_DIRECTION, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, urand(), and VICTIMSTATE_DODGE.

◆ Say() [1/2]

◆ Say() [2/2]

void Unit::Say ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21185{
21186 Talk(textId, CHAT_MSG_MONSTER_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
21187}

References CHAT_MSG_MONSTER_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ SelectNearbyNoTotemTarget()

Unit * Unit::SelectNearbyNoTotemTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17007{
17008 std::list<Unit*> targets;
17009 Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck u_check(this, this, dist);
17011 Cell::VisitAllObjects(this, searcher, dist);
17012
17013 // remove current target
17014 if (GetVictim())
17015 targets.remove(GetVictim());
17016
17017 if (exclude)
17018 targets.remove(exclude);
17019
17020 // remove not LoS targets
17021 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17022 {
17023 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17024 {
17025 std::list<Unit*>::iterator tIter2 = tIter;
17026 ++tIter;
17027 targets.erase(tIter2);
17028 }
17029 else
17030 ++tIter;
17031 }
17032
17033 // no appropriate targets
17034 if (targets.empty())
17035 return nullptr;
17036
17037 // select random
17039}
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition: Containers.h:133
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition: Unit.cpp:13857
Definition: GridNotifiers.h:423

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitAllObjects().

Referenced by spell_rog_blade_flurry::CheckProc(), and spell_warr_sweeping_strikes::CheckProc().

◆ SelectNearbyTarget()

Unit * Unit::SelectNearbyTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
16972{
16973 std::list<Unit*> targets;
16974 Acore::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist);
16976 Cell::VisitAllObjects(this, searcher, dist);
16977
16978 // remove current target
16979 if (GetVictim())
16980 targets.remove(GetVictim());
16981
16982 if (exclude)
16983 targets.remove(exclude);
16984
16985 // remove not LoS targets
16986 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
16987 {
16988 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
16989 {
16990 std::list<Unit*>::iterator tIter2 = tIter;
16991 ++tIter;
16992 targets.erase(tIter2);
16993 }
16994 else
16995 ++tIter;
16996 }
16997
16998 // no appropriate targets
16999 if (targets.empty())
17000 return nullptr;
17001
17002 // select random
17004}
Definition: GridNotifiers.h:861

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitAllObjects().

Referenced by npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_curator::JustSummoned(), npc_hodirs_fury::npc_hodirs_furyAI::UpdateAI(), npc_storm_beacon_spawn::npc_storm_beacon_spawnAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), Player::UpdateCharmedAI(), and boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI().

◆ SendAttackStateUpdate() [1/2]

void Unit::SendAttackStateUpdate ( CalcDamageInfo damageInfo)

Probably used for debugging purposes, as it is not known to appear on retail servers

6480{
6481 LOG_DEBUG("entities.unit", "WORLD: Sending SMSG_ATTACKERSTATEUPDATE");
6482
6483 uint32 tmpDamage[MAX_ITEM_PROTO_DAMAGES] = { };
6484 uint32 tmpAbsorb[MAX_ITEM_PROTO_DAMAGES] = { };
6485 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6486 {
6487 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6488 tmpDamage[i] = damageInfo->damages[i].damage;
6489 tmpAbsorb[i] = damageInfo->damages[i].absorb;
6490 if (damageInfo->target->IsPlayer() && damageInfo->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6491 {
6492 tmpAbsorb[i] = tmpDamage[i];
6493 tmpDamage[i] = 0;
6494 }
6495 }
6496
6497 uint32 count = 1;
6498 if (tmpDamage[1] || tmpAbsorb[1] || damageInfo->damages[1].resist)
6499 {
6500 ++count;
6501 }
6502
6503 std::size_t const maxsize = 4 + 5 + 5 + 4 + 4 + 1 + count * (4 + 4 + 4 + 4 + 4) + 1 + 4 + 4 + 4 + 4 + 4 * 12;
6504 WorldPacket data(SMSG_ATTACKERSTATEUPDATE, maxsize); // we guess size
6505 data << uint32(damageInfo->HitInfo);
6506 data << damageInfo->attacker->GetPackGUID();
6507 data << damageInfo->target->GetPackGUID();
6508 data << uint32(tmpDamage[0] + tmpDamage[1]); // Full damage
6509 int32 overkill = tmpDamage[0] + tmpDamage[1] - damageInfo->target->GetHealth();
6510 data << uint32(overkill < 0 ? 0 : overkill); // Overkill
6511 data << uint8(count); // Sub damage count
6512
6513 for (uint32 i = 0; i < count; ++i)
6514 {
6515 data << uint32(damageInfo->damages[i].damageSchoolMask); // School of sub damage
6516 data << float(tmpDamage[i]); // sub damage
6517 data << uint32(tmpDamage[i]); // Sub Damage
6518 }
6519
6521 {
6522 for (uint32 i = 0; i < count; ++i)
6523 {
6524 data << uint32(tmpAbsorb[i]); // Absorb
6525 }
6526 }
6527
6529 {
6530 for (uint32 i = 0; i < count; ++i)
6531 {
6532 data << uint32(damageInfo->damages[i].resist); // Resist
6533 }
6534 }
6535
6536 data << uint8(damageInfo->TargetState);
6537 data << uint32(0); // Unknown attackerstate
6538 data << uint32(0); // Melee spellid
6539
6540 if (damageInfo->HitInfo & HITINFO_BLOCK)
6541 data << uint32(damageInfo->blocked_amount);
6542
6543 if (damageInfo->HitInfo & HITINFO_RAGE_GAIN)
6544 data << uint32(0);
6545
6547 if (damageInfo->HitInfo & HITINFO_UNK1)
6548 {
6549 data << uint32(0);
6550 data << float(0);
6551 data << float(0);
6552 data << float(0);
6553 data << float(0);
6554 data << float(0);
6555 data << float(0);
6556 data << float(0);
6557 data << float(0);
6558 data << float(0); // Found in a loop with 1 iteration
6559 data << float(0); // ditto ^
6560 data << uint32(0);
6561 }
6562
6563 SendMessageToSet(&data, true);
6564}
@ HITINFO_RAGE_GAIN
Definition: Unit.h:120
@ HITINFO_UNK1
Definition: Unit.h:97
@ SMSG_ATTACKERSTATEUPDATE
Definition: Opcodes.h:360

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CHEAT_GOD, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), CalcDamageInfo::HitInfo, HITINFO_BLOCK, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_RAGE_GAIN, HITINFO_UNK1, Object::IsPlayer(), LOG_DEBUG, MAX_ITEM_PROTO_DAMAGES, CalcDamageInfo::resist, WorldObject::SendMessageToSet(), SMSG_ATTACKERSTATEUPDATE, CalcDamageInfo::target, CalcDamageInfo::TargetState, and Object::ToPlayer().

Referenced by AttackerStateUpdate(), misc_commandscript::HandleDamageCommand(), spell_dk_dancing_rune_weapon::HandleProc(), and SendAttackStateUpdate().

◆ SendAttackStateUpdate() [2/2]

void Unit::SendAttackStateUpdate ( uint32  HitInfo,
Unit target,
uint8  SwingType,
SpellSchoolMask  damageSchoolMask,
uint32  Damage,
uint32  AbsorbDamage,
uint32  Resist,
VictimState  TargetState,
uint32  BlockedAmount 
)
6567{
6568 CalcDamageInfo dmgInfo;
6569 dmgInfo.HitInfo = HitInfo;
6570 dmgInfo.attacker = this;
6571 dmgInfo.target = target;
6572
6573 dmgInfo.damages[0].damage = Damage - AbsorbDamage - Resist - BlockedAmount;
6574 dmgInfo.damages[0].damageSchoolMask = damageSchoolMask;
6575 dmgInfo.damages[0].absorb = AbsorbDamage;
6576 dmgInfo.damages[0].resist = Resist;
6577
6578 dmgInfo.damages[1].damage = 0;
6579 dmgInfo.damages[1].damageSchoolMask = 0;
6580 dmgInfo.damages[1].absorb = 0;
6581 dmgInfo.damages[1].resist = 0;
6582
6583 dmgInfo.TargetState = TargetState;
6584 dmgInfo.blocked_amount = BlockedAmount;
6585 SendAttackStateUpdate(&dmgInfo);
6586}
HitInfo
Definition: Unit.h:95

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, CalcDamageInfo::HitInfo, CalcDamageInfo::resist, SendAttackStateUpdate(), CalcDamageInfo::target, and CalcDamageInfo::TargetState.

◆ SendChangeCurrentVictimOpcode()

void Unit::SendChangeCurrentVictimOpcode ( HostileReference pHostileReference)
20086{
20087 if (!GetThreatMgr().isThreatListEmpty())
20088 {
20089 uint32 count = GetThreatMgr().GetThreatList().size();
20090
20091 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_HIGHEST_THREAT_UPDATE Message");
20092 WorldPacket data(SMSG_HIGHEST_THREAT_UPDATE, 8 + 8 + count * 8);
20093 data << GetPackGUID();
20094 data << pHostileReference->getUnitGuid().WriteAsPacked();
20095 data << uint32(count);
20097 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
20098 {
20099 data << (*itr)->getUnitGuid().WriteAsPacked();
20100 data << uint32((*itr)->GetThreat() * 100);
20101 }
20102 SendMessageToSet(&data, false);
20103 }
20104}
@ SMSG_HIGHEST_THREAT_UPDATE
Definition: Opcodes.h:1184
std::list< HostileReference * > StorageType
Definition: ThreatMgr.h:148
PackedGuid WriteAsPacked() const
Definition: ObjectGuid.h:316

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_HIGHEST_THREAT_UPDATE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::setCurrentVictim().

◆ SendClearTarget()

void Unit::SendClearTarget ( )
20314{
20316 data << GetPackGUID();
20317 SendMessageToSet(&data, false);
20318}
@ SMSG_BREAK_TARGET
Definition: Opcodes.h:368

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_BREAK_TARGET.

Referenced by Vehicle::AddPassenger(), and Spell::EffectForceDeselect().

◆ SendClearThreatListOpcode()

void Unit::SendClearThreatListOpcode ( )
20107{
20108 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_CLEAR Message");
20110 data << GetPackGUID();
20111 SendMessageToSet(&data, false);
20112}
@ SMSG_THREAT_CLEAR
Definition: Opcodes.h:1187

References Object::GetPackGUID(), LOG_DEBUG, WorldObject::SendMessageToSet(), and SMSG_THREAT_CLEAR.

Referenced by ThreatMgr::ClearAllThreat().

◆ SendComboPoints()

void Unit::SendComboPoints ( )
16869{
16870 if (m_cleanupDone)
16871 {
16872 return;
16873 }
16874
16876 if (Player* playerMe = ToPlayer())
16877 {
16878 WorldPacket data(SMSG_UPDATE_COMBO_POINTS, packGUID.size() + 1);
16879 data << packGUID;
16880 data << uint8(m_comboPoints);
16881 playerMe->SendDirectMessage(&data);
16882 }
16883
16884 ObjectGuid ownerGuid = GetCharmerOrOwnerGUID();
16885 Player* owner = nullptr;
16886 if (ownerGuid.IsPlayer())
16887 {
16888 owner = ObjectAccessor::GetPlayer(*this, ownerGuid);
16889 }
16890
16891 if (m_movedByPlayer || owner)
16892 {
16893 WorldPacket data(SMSG_PET_UPDATE_COMBO_POINTS, GetPackGUID().size() + packGUID.size() + 1);
16894 data << GetPackGUID();
16895 data << packGUID;
16896 data << uint8(m_comboPoints);
16897
16898 if (m_movedByPlayer)
16900
16901 if (owner && owner != m_movedByPlayer)
16902 owner->SendDirectMessage(&data);
16903 }
16904}
@ SMSG_PET_UPDATE_COMBO_POINTS
Definition: Opcodes.h:1200
@ SMSG_UPDATE_COMBO_POINTS
Definition: Opcodes.h:955
Definition: ObjectGuid.h:263
std::size_t size() const
Definition: ObjectGuid.h:274

References GetCharmerOrOwnerGUID(), Object::GetPackGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), m_cleanupDone, m_comboPoints, m_comboTarget, m_movedByPlayer, Player::SendDirectMessage(), PackedGuid::size(), SMSG_PET_UPDATE_COMBO_POINTS, SMSG_UPDATE_COMBO_POINTS, and Object::ToPlayer().

Referenced by AddComboPoints(), and ClearComboPoints().

◆ SendEnergizeSpellLog()

void Unit::SendEnergizeSpellLog ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11247{
11248 WorldPacket data(SMSG_SPELLENERGIZELOG, (8 + 8 + 4 + 4 + 4 + 1));
11249 data << victim->GetPackGUID();
11250 data << GetPackGUID();
11251 data << uint32(spellID);
11252 data << uint32(powerType);
11253 data << uint32(damage);
11254 SendMessageToSet(&data, true);
11255}
@ SMSG_SPELLENERGIZELOG
Definition: Opcodes.h:367

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLENERGIZELOG.

Referenced by EnergizeBySpell(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ SendHealSpellLog()

void Unit::SendHealSpellLog ( HealInfo const &  healInfo,
bool  critical = false 
)
11214{
11215 uint32 overheal = healInfo.GetHeal() - healInfo.GetEffectiveHeal();
11216
11217 // we guess size
11218 WorldPacket data(SMSG_SPELLHEALLOG, (8 + 8 + 4 + 4 + 4 + 4 + 1 + 1));
11219 data << healInfo.GetTarget()->GetPackGUID();
11220 data << GetPackGUID();
11221 data << uint32(healInfo.GetSpellInfo()->Id);
11222 data << uint32(healInfo.GetHeal());
11223 data << uint32(overheal);
11224 data << uint32(healInfo.GetAbsorb()); // Absorb amount
11225 data << uint8(critical ? 1 : 0);
11226 data << uint8(0); // unused
11227 SendMessageToSet(&data, true);
11228}
@ SMSG_SPELLHEALLOG
Definition: Opcodes.h:366

References HealInfo::GetAbsorb(), HealInfo::GetEffectiveHeal(), HealInfo::GetHeal(), Object::GetPackGUID(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SpellInfo::Id, WorldObject::SendMessageToSet(), and SMSG_SPELLHEALLOG.

Referenced by HealBySpell().

◆ SendMeleeAttackStart()

void Unit::SendMeleeAttackStart ( Unit victim,
Player sendTo = nullptr 
)
3062{
3063 WorldPacket data(SMSG_ATTACKSTART, 8 + 8);
3064 data << GetGUID();
3065 data << victim->GetGUID();
3066 if (sendTo)
3067 sendTo->SendDirectMessage(&data);
3068 else
3069 SendMessageToSet(&data, true);
3070 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTART");
3071}
@ SMSG_ATTACKSTART
Definition: Opcodes.h:353

References Object::GetGUID(), LOG_DEBUG, Player::SendDirectMessage(), WorldObject::SendMessageToSet(), and SMSG_ATTACKSTART.

Referenced by Attack(), Player::GetInitialVisiblePackets(), and boss_leotheras_the_blind::Reset().

◆ SendMeleeAttackStop()

void Unit::SendMeleeAttackStop ( Unit victim = nullptr)

Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.

3078{
3079 // pussywizard: calling SendMeleeAttackStop without clearing UNIT_STATE_MELEE_ATTACKING and then AttackStart the same player may spoil npc rotating!
3080 // pussywizard: this happens in some boss scripts, just add clearing here
3081 // ClearUnitState(UNIT_STATE_MELEE_ATTACKING); // commented out for now
3082
3083 WorldPacket data(SMSG_ATTACKSTOP, (8 + 8 + 4));
3084 data << GetPackGUID();
3085
3086 if (victim)
3087 {
3088 data << victim->GetPackGUID();
3089 data << (uint32)victim->isDead();
3090 }
3091 SendMessageToSet(&data, true);
3092 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTOP");
3093
3094 if (victim)
3095 LOG_DEBUG("entities.unit", "{} {} stopped attacking {} {}", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString(), (victim->IsPlayer() ? "player" : "creature"), victim->GetGUID().ToString());
3096 else
3097 LOG_DEBUG("entities.unit", "{} {} stopped attacking", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString());
3098}
@ SMSG_ATTACKSTOP
Definition: Opcodes.h:354
bool isDead() const
Definition: Unit.h:1218

References Object::GetGUID(), Object::GetPackGUID(), isDead(), Object::IsPlayer(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_ATTACKSTOP, ObjectGuid::ToString(), and Position::ToString().

Referenced by Attack(), AttackStop(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_svalna_revive_champion::Land(), boss_leotheras_the_blind::Reset(), SetControlled(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), and boss_razorscale::boss_razorscaleAI::UpdateAI().

◆ SendMonsterMove()

void Unit::SendMonsterMove ( float  NewPosX,
float  NewPosY,
float  NewPosZ,
uint32  TransitTime,
SplineFlags  sf = SPLINEFLAG_WALK_MODE 
)
538{
539 WorldPacket data(SMSG_MONSTER_MOVE, 1 + 12 + 4 + 1 + 4 + 4 + 4 + 12 + GetPackGUID().size());
540 data << GetPackGUID();
541
542 data << uint8(0); // new in 3.1
543 data << GetPositionX() << GetPositionY() << GetPositionZ();
544 data << GameTime::GetGameTimeMS().count();
545 data << uint8(0);
546 data << uint32(sf);
547 data << TransitTime; // Time in between points
548 data << uint32(1); // 1 single waypoint
549 data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
550
551 SendMessageToSet(&data, true);
552}
@ SMSG_MONSTER_MOVE
Definition: Opcodes.h:251

References GameTime::GetGameTimeMS(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::SendMessageToSet(), and SMSG_MONSTER_MOVE.

Referenced by npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI().

◆ SendMovementFeatherFall()

void Unit::SendMovementFeatherFall ( Player sendTo)
20652{
20653 if (!movespline->Initialized())
20654 return;
20656 data << GetPackGUID();
20657 sendTo->SendDirectMessage(&data);
20658}
@ SMSG_SPLINE_MOVE_FEATHER_FALL
Definition: Opcodes.h:803

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_FEATHER_FALL.

Referenced by Player::GetAurasForTarget().

◆ SendMovementFlagUpdate()

void Unit::SendMovementFlagUpdate ( bool  self = false)
16692{
16693 WorldPacket data;
16694 BuildHeartBeatMsg(&data);
16695 SendMessageToSet(&data, self);
16696}
void BuildHeartBeatMsg(WorldPacket *data) const
Definition: Object.cpp:2073

References BuildHeartBeatMsg(), and WorldObject::SendMessageToSet().

Referenced by boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_nightbane::EnterEvadeMode(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_harbinger_skyriss::JustSummoned(), MotionMaster::MoveFall(), npc_twilight_volunteer::MovementInform(), boss_felmyst::boss_felmystAI::MovementInform(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_dancing_flames::npc_dancing_flamesAI::Reset(), SetCharm(), SetHover(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ SendMovementHover()

void Unit::SendMovementHover ( Player sendTo)
20689{
20690 if (!movespline->Initialized())
20691 return;
20693 data << GetPackGUID();
20694 sendTo->SendDirectMessage(&data);
20695}
@ SMSG_SPLINE_MOVE_SET_HOVER
Definition: Opcodes.h:805

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_SET_HOVER.

Referenced by Player::GetAurasForTarget().

◆ SendMovementWaterWalking()

void Unit::SendMovementWaterWalking ( Player sendTo)
20630{
20631 if (!movespline->Initialized())
20632 return;
20634 data << GetPackGUID();
20635 sendTo->SendDirectMessage(&data);
20636}
@ SMSG_SPLINE_MOVE_WATER_WALK
Definition: Opcodes.h:807

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_WATER_WALK.

Referenced by Player::GetAurasForTarget().

◆ SendPeriodicAuraLog()

void Unit::SendPeriodicAuraLog ( SpellPeriodicAuraLogInfo pInfo)
6390{
6391 AuraEffect const* aura = pInfo->auraEff;
6393 data << GetPackGUID();
6394 data << aura->GetCasterGUID().WriteAsPacked();
6395 data << uint32(aura->GetId()); // spellId
6396 data << uint32(1); // count
6397 data << uint32(aura->GetAuraType()); // auraId
6398 switch (aura->GetAuraType())
6399 {
6402 {
6403 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6404 uint32 damage = pInfo->damage;
6405 uint32 absorb = pInfo->absorb;
6406 if (IsPlayer() && ToPlayer()->GetCommandStatus(CHEAT_GOD))
6407 {
6408 absorb = damage;
6409 damage = 0;
6410 }
6411
6412 data << uint32(damage); // damage
6413 data << uint32(pInfo->overDamage); // overkill?
6414 data << uint32(aura->GetSpellInfo()->GetSchoolMask());
6415 data << uint32(absorb); // absorb
6416 data << uint32(pInfo->resist); // resist
6417 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6418 }
6419 break;
6422 data << uint32(pInfo->damage); // damage
6423 data << uint32(pInfo->overDamage); // overheal
6424 data << uint32(pInfo->absorb); // absorb
6425 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6426 break;
6429 data << uint32(aura->GetMiscValue()); // power type
6430 data << uint32(pInfo->damage); // damage
6431 break;
6433 data << uint32(aura->GetMiscValue()); // power type
6434 data << uint32(pInfo->damage); // amount
6435 data << float(pInfo->multiplier); // gain multiplier
6436 break;
6437 default:
6438 LOG_ERROR("entities.unit", "Unit::SendPeriodicAuraLog: unknown aura {}", uint32(aura->GetAuraType()));
6439 return;
6440 }
6441
6442 SendMessageToSet(&data, true);
6443}
@ SPELL_AURA_OBS_MOD_HEALTH
Definition: SpellAuraDefines.h:83
@ SPELL_AURA_PERIODIC_MANA_LEECH
Definition: SpellAuraDefines.h:127
@ SPELL_AURA_PERIODIC_ENERGIZE
Definition: SpellAuraDefines.h:87
@ SMSG_PERIODICAURALOG
Definition: Opcodes.h:620
float multiplier
Definition: Unit.h:521
bool critical
Definition: Unit.h:522
uint32 overDamage
Definition: Unit.h:518
uint32 resist
Definition: Unit.h:520
uint32 damage
Definition: Unit.h:517
AuraEffect const * auraEff
Definition: Unit.h:516
uint32 absorb
Definition: Unit.h:519

References SpellPeriodicAuraLogInfo::absorb, SpellPeriodicAuraLogInfo::auraEff, CHEAT_GOD, SpellPeriodicAuraLogInfo::critical, SpellPeriodicAuraLogInfo::damage, AuraEffect::GetAuraType(), AuraEffect::GetCasterGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), Object::GetPackGUID(), SpellInfo::GetSchoolMask(), AuraEffect::GetSpellInfo(), Object::IsPlayer(), LOG_ERROR, SpellPeriodicAuraLogInfo::multiplier, SpellPeriodicAuraLogInfo::overDamage, SpellPeriodicAuraLogInfo::resist, WorldObject::SendMessageToSet(), SMSG_PERIODICAURALOG, SPELL_AURA_OBS_MOD_HEALTH, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_ENERGIZE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_MANA_LEECH, Object::ToPlayer(), and ObjectGuid::WriteAsPacked().

Referenced by AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SendPetActionFeedback()

void Unit::SendPetActionFeedback ( uint8  msg)

-------—Pet responses methods--------------—

16596{
16597 Unit* owner = GetOwner();
16598 if (!owner || !owner->IsPlayer())
16599 return;
16600
16602 data << uint8(msg);
16603 owner->ToPlayer()->GetSession()->SendPacket(&data);
16604}
@ SMSG_PET_ACTION_FEEDBACK
Definition: Opcodes.h:740

References GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_PET_ACTION_FEEDBACK, and Object::ToPlayer().

Referenced by WorldSession::HandlePetCancelAuraOpcode().

◆ SendPetAIReaction()

void Unit::SendPetAIReaction ( ObjectGuid  guid)
16619{
16620 Unit* owner = GetOwner();
16621 if (!owner || !owner->IsPlayer())
16622 return;
16623
16624 WorldPacket data(SMSG_AI_REACTION, 8 + 4);
16625 data << guid;
16626 data << uint32(AI_REACTION_HOSTILE);
16627 owner->ToPlayer()->GetSession()->SendPacket(&data);
16628}
@ SMSG_AI_REACTION
Definition: Opcodes.h:346

References AI_REACTION_HOSTILE, GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_AI_REACTION, and Object::ToPlayer().

Referenced by PetAI::DoAttack(), and WorldSession::HandlePetActionHelper().

◆ SendPetTalk()

void Unit::SendPetTalk ( uint32  pettalk)
16607{
16608 Unit* owner = GetOwner();
16609 if (!owner || !owner->IsPlayer())
16610 return;
16611
16613 data << GetGUID();
16614 data << uint32(pettalk);
16615 owner->ToPlayer()->GetSession()->SendPacket(&data);
16616}
@ SMSG_PET_ACTION_SOUND
Definition: Opcodes.h:834

References Object::GetGUID(), GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_PET_ACTION_SOUND, and Object::ToPlayer().

Referenced by WorldSession::HandlePetActionHelper().

◆ SendPlaySpellImpact()

void Unit::SendPlaySpellImpact ( ObjectGuid  guid,
uint32  id 
)
18907{
18909 data << guid; // target
18910 data << uint32(id); // SpellVisualKit.dbc index
18911 SendMessageToSet(&data, true);
18912}
@ SMSG_PLAY_SPELL_IMPACT
Definition: Opcodes.h:533

References WorldObject::SendMessageToSet(), and SMSG_PLAY_SPELL_IMPACT.

Referenced by debug_commandscript::HandleDebugVisualCommand(), and WorldSession::HandleTrainerBuySpellOpcode().

◆ SendPlaySpellVisual()

void Unit::SendPlaySpellVisual ( uint32  id)
18899{
18901 data << GetGUID();
18902 data << uint32(id); // SpellVisualKit.dbc index
18903 SendMessageToSet(&data, true);
18904}
@ SMSG_PLAY_SPELL_VISUAL
Definition: Opcodes.h:529

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PLAY_SPELL_VISUAL.

Referenced by debug_commandscript::HandleDebugVisualCommand(), WorldSession::HandleTrainerBuySpellOpcode(), and Player::RegenerateAll().

◆ SendRemoveFromThreatListOpcode()

void Unit::SendRemoveFromThreatListOpcode ( HostileReference pHostileReference)
20115{
20116 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_REMOVE Message");
20117 WorldPacket data(SMSG_THREAT_REMOVE, 8 + 8);
20118 data << GetPackGUID();
20119 data << pHostileReference->getUnitGuid().WriteAsPacked();
20120 SendMessageToSet(&data, false);
20121}
@ SMSG_THREAT_REMOVE
Definition: Opcodes.h:1186

References Object::GetPackGUID(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_THREAT_REMOVE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::processThreatEvent().

◆ SendSpellDamageImmune()

void Unit::SendSpellDamageImmune ( Unit target,
uint32  spellId 
)
6470{
6471 WorldPacket data(SMSG_SPELLORDAMAGE_IMMUNE, 8 + 8 + 4 + 1);
6472 data << GetGUID();
6473 data << target->GetGUID();
6474 data << uint32(spellId);
6475 data << uint8(0); // bool - log format: 0-default, 1-debug
6476 SendMessageToSet(&data, true);
6477}
@ SMSG_SPELLORDAMAGE_IMMUNE
Definition: Opcodes.h:641

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLORDAMAGE_IMMUNE.

Referenced by DealMeleeDamage(), and AuraEffect::SendTickImmune().

◆ SendSpellDamageResist()

void Unit::SendSpellDamageResist ( Unit target,
uint32  spellId 
)
6460{
6461 WorldPacket data(SMSG_PROCRESIST, 8 + 8 + 4 + 1);
6462 data << GetGUID();
6463 data << target->GetGUID();
6464 data << uint32(spellId);
6465 data << uint8(0); // bool - log format: 0-default, 1-debug
6466 SendMessageToSet(&data, true);
6467}
@ SMSG_PROCRESIST
Definition: Opcodes.h:638

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PROCRESIST.

◆ SendSpellMiss()

void Unit::SendSpellMiss ( Unit target,
uint32  spellID,
SpellMissInfo  missInfo 
)
6446{
6447 WorldPacket data(SMSG_SPELLLOGMISS, (4 + 8 + 1 + 4 + 8 + 1));
6448 data << uint32(spellID);
6449 data << GetGUID();
6450 data << uint8(0); // can be 0 or 1
6451 data << uint32(1); // target count
6452 // for (i = 0; i < target count; ++i)
6453 data << target->GetGUID(); // target GUID
6454 data << uint8(missInfo);
6455 // end loop
6456 SendMessageToSet(&data, true);
6457}
@ SMSG_SPELLLOGMISS
Definition: Opcodes.h:617

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLLOGMISS.

Referenced by DealMeleeDamage(), and Spell::DoAllEffectOnTarget().

◆ SendSpellNonMeleeDamageLog() [1/2]

void Unit::SendSpellNonMeleeDamageLog ( SpellNonMeleeDamage log)
6311{
6312 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6313 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6314 uint32 damage = log->damage;
6315 uint32 absorb = log->absorb;
6316 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6317 {
6318 absorb = damage;
6319 damage = 0;
6320 }
6321 data << log->target->GetPackGUID();
6322 data << log->attacker->GetPackGUID();
6323 data << uint32(log->spellInfo->Id);
6324 data << uint32(damage); // damage amount
6325 int32 overkill = damage - log->target->GetHealth();
6326 data << uint32(overkill > 0 ? overkill : 0); // overkill
6327 data << uint8 (log->schoolMask); // damage school
6328 data << uint32(absorb); // AbsorbedDamage
6329 data << uint32(log->resist); // resist
6330 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6331 data << uint8 (log->unused); // unused
6332 data << uint32(log->blocked); // blocked
6333 data << uint32(log->HitInfo);
6334 data << uint32(log->HitInfo);
6336 //if (log->HitInfo & SPELL_HIT_TYPE_CRIT_DEBUG)
6337 //{
6338 // data << float(log->CritRoll);
6339 // data << float(log->CritNeeded);
6340 //}
6341 //if (log->HitInfo & SPELL_HIT_TYPE_HIT_DEBUG)
6342 //{
6343 // data << float(log->HitRoll);
6344 // data << float(log->HitNeeded);
6345 //}
6346 //if (log->HitInfo & SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG)
6347 //{
6348 // data << float(log->MissChance);
6349 // data << float(log->DodgeChance);
6350 // data << float(log->ParryChance);
6351 // data << float(log->BlockChance);
6352 // data << float(log->GlanceChance);
6353 // data << float(log->CrushChance);
6354 //}
6355 SendMessageToSet(&data, true);
6356}
@ SPELL_HIT_TYPE_HIT_DEBUG
Definition: SharedDefines.h:1537
@ SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG
Definition: SharedDefines.h:1540
@ SPELL_HIT_TYPE_CRIT_DEBUG
Definition: SharedDefines.h:1535
@ SMSG_SPELLNONMELEEDAMAGELOG
Definition: Opcodes.h:622
bool physicalLog
Definition: Unit.h:503
bool unused
Definition: Unit.h:504

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, WorldObject::SendMessageToSet(), SMSG_SPELLNONMELEEDAMAGELOG, SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG, SPELL_HIT_TYPE_CRIT_DEBUG, SPELL_HIT_TYPE_HIT_DEBUG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by CalcAbsorbResist(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectEnvironmentalDMG(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and SendSpellNonMeleeDamageLog().

◆ SendSpellNonMeleeDamageLog() [2/2]

void Unit::SendSpellNonMeleeDamageLog ( Unit target,
SpellInfo const *  spellInfo,
uint32  Damage,
SpellSchoolMask  damageSchoolMask,
uint32  AbsorbedDamage,
uint32  Resist,
bool  PhysicalDamage,
uint32  Blocked,
bool  CriticalHit = false,
bool  Split = false 
)
6359{
6360 SpellNonMeleeDamage log(this, target, spellInfo, damageSchoolMask);
6361 log.damage = Damage;
6362 log.absorb = AbsorbedDamage;
6363 log.resist = Resist;
6364 log.physicalLog = PhysicalDamage;
6365 log.blocked = Blocked;
6366 log.HitInfo = 0;
6367 if (CriticalHit)
6368 {
6369 log.HitInfo |= SPELL_HIT_TYPE_CRIT;
6370 }
6371 if (Split)
6372 {
6373 log.HitInfo |= SPELL_HIT_TYPE_SPLIT;
6374 }
6376}
@ SPELL_HIT_TYPE_SPLIT
Definition: SharedDefines.h:1538
Definition: Unit.h:489

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, SpellNonMeleeDamage::damage, SpellNonMeleeDamage::HitInfo, SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SendSpellNonMeleeDamageLog(), SPELL_HIT_TYPE_CRIT, and SPELL_HIT_TYPE_SPLIT.

◆ SendSpellNonMeleeReflectLog()

void Unit::SendSpellNonMeleeReflectLog ( SpellNonMeleeDamage log,
Unit attacker 
)
6279{
6280 // Xinef: function for players only, placed in unit because of cosmetics
6281 if (!IsPlayer())
6282 return;
6283
6284 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6285 // If we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our HP bar will not drop
6286 uint32 damage = log->damage;
6287 uint32 absorb = log->absorb;
6288 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6289 {
6290 absorb = damage;
6291 damage = 0;
6292 }
6293 data << log->target->GetPackGUID();
6294 data << attacker->GetPackGUID();
6295 data << uint32(log->spellInfo->Id);
6296 data << uint32(damage); // damage amount
6297 int32 overkill = damage - log->target->GetHealth();
6298 data << uint32(overkill > 0 ? overkill : 0); // overkill
6299 data << uint8 (log->schoolMask); // damage school
6300 data << uint32(absorb); // AbsorbedDamage
6301 data << uint32(log->resist); // resist
6302 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6303 data << uint8 (log->unused); // unused
6304 data << uint32(log->blocked); // blocked
6305 data << uint32(log->HitInfo);
6306 data << uint8 (0); // flag to use extend data
6307 ToPlayer()->SendDirectMessage(&data);
6308}

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, Player::SendDirectMessage(), SMSG_SPELLNONMELEEDAMAGELOG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by Spell::DoAllEffectOnTarget().

◆ SendTameFailure()

void Unit::SendTameFailure ( uint8  result)
19987{
19989 data << uint8(result);
19990 ToPlayer()->SendDirectMessage(&data);
19991}
@ SMSG_PET_TAME_FAILURE
Definition: Opcodes.h:401

References Player::SendDirectMessage(), SMSG_PET_TAME_FAILURE, and Object::ToPlayer().

Referenced by spell_hun_tame_beast::CheckCast(), and Spell::CheckCast().

◆ SendTeleportPacket()

void Unit::SendTeleportPacket ( Position pos)
19994{
19996 if (IsCreature())
19997 Relocate(&pos);
19998 if (IsPlayer())
19999 {
20000 ToPlayer()->SetCanTeleport(true);
20001 }
20002 WorldPacket data2(MSG_MOVE_TELEPORT, 38);
20003 data2 << GetPackGUID();
20004 BuildMovementPacket(&data2);
20005 if (IsCreature())
20006 Relocate(&oldPos);
20007 if (IsPlayer())
20008 Relocate(&pos);
20009 SendMessageToSet(&data2, false);
20010}
@ MSG_MOVE_TELEPORT
Definition: Opcodes.h:227

References BuildMovementPacket(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsCreature(), Object::IsPlayer(), MSG_MOVE_TELEPORT, Position::Relocate(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), and Object::ToPlayer().

Referenced by NearTeleportTo(), and Player::TeleportTo().

◆ SendThreatListUpdate()

void Unit::SendThreatListUpdate ( )
20066{
20067 if (!GetThreatMgr().isThreatListEmpty())
20068 {
20069 uint32 count = GetThreatMgr().GetThreatList().size();
20070
20071 //LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_UPDATE Message");
20072 WorldPacket data(SMSG_THREAT_UPDATE, 8 + count * 8);
20073 data << GetPackGUID();
20074 data << uint32(count);
20076 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
20077 {
20078 data << (*itr)->getUnitGuid().WriteAsPacked();
20079 data << uint32((*itr)->GetThreat() * 100);
20080 }
20081 SendMessageToSet(&data, false);
20082 }
20083}
@ SMSG_THREAT_UPDATE
Definition: Opcodes.h:1185

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::SendMessageToSet(), and SMSG_THREAT_UPDATE.

Referenced by Update().

◆ SetAI()

void Unit::SetAI ( UnitAI newAI)
inline
659{ i_AI = newAI; }

References i_AI.

◆ SetArmor()

void Unit::SetArmor ( int32  val)
inline

◆ SetAttackTime()

◆ setAttackTimer()

◆ SetAuraStack()

void Unit::SetAuraStack ( uint32  spellId,
Unit target,
uint32  stack 
)
18890{
18891 Aura* aura = target->GetAura(spellId, GetGUID());
18892 if (!aura)
18893 aura = AddAura(spellId, target);
18894 if (aura && stack)
18895 aura->SetStackAmount(stack);
18896}
void SetStackAmount(uint8 num)
Definition: SpellAuras.cpp:995

References AddAura(), GetAura(), Object::GetGUID(), and Aura::SetStackAmount().

Referenced by boss_viscidus::DamageTaken(), spell_capacitus_polarity_charge::HandleTargets(), spell_thaddius_pos_neg_charge::HandleTargets(), and BattlefieldWG::OnPlayerJoinWar().

◆ SetBaseWeaponDamage()

void Unit::SetBaseWeaponDamage ( WeaponAttackType  attType,
WeaponDamageRange  damageRange,
float  value,
uint8  damageIndex = 0 
)
inline
922{ m_weaponDamage[attType][damageRange][damageIndex] = value; }

References m_weaponDamage.

Referenced by Player::_ApplyWeaponDamage(), Guardian::InitStatsForLevel(), and Creature::SelectLevel().

◆ SetCanDualWield()

virtual void Unit::SetCanDualWield ( bool  value)
inlinevirtual

◆ SetCanFly()

bool Unit::SetCanFly ( bool  enable,
bool  packetOnly = false 
)
virtual

Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().

Doesn't inform the client.

Reimplemented in Player, and Creature.

20595{
20597 return false;
20598
20599 if (enable)
20600 {
20603 }
20604 else
20605 {
20607 }
20608
20609 return true;
20610}
@ MOVEMENTFLAG_CAN_FLY
Definition: UnitDefines.h:368
@ MOVEMENTFLAG_MASK_MOVING_FLY
Definition: UnitDefines.h:385
void AddUnitMovementFlag(uint32 f)
Definition: Unit.h:1625

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_CAN_FLY, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_MASK_MOVING_FLY, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_chapter5_light_of_dawn_aura::spell_chapter5_light_of_dawn_aura_AuraScript::OnApply(), spell_chapter5_light_of_dawn_aura::spell_chapter5_light_of_dawn_aura_AuraScript::OnRemove(), Player::SetCanFly(), and Creature::SetCanFly().

◆ SetCanModifyStats()

◆ SetCantProc()

void Unit::SetCantProc ( bool  apply)
17274{
17275 if (apply)
17276 ++m_procDeep;
17277 else
17278 {
17280 --m_procDeep;
17281 }
17282}

References ASSERT, and m_procDeep.

Referenced by HandleDummyAuraProc(), and ProcDamageAndSpellFor().

◆ SetCharm()

void Unit::SetCharm ( Unit target,
bool  apply 
)
Todo:
: maybe we can use this flag to check if controlled by player
10863{
10864 if (apply)
10865 {
10866 if (IsPlayer())
10867 {
10868 if (!AddGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10869 LOG_FATAL("entities.unit", "Player {} is trying to charm unit {}, but it already has a charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10870
10871 charm->m_ControlledByPlayer = true;
10873 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10874 }
10875 else
10876 charm->m_ControlledByPlayer = false;
10877
10878 // PvP, FFAPvP
10879 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, GetByteValue(UNIT_FIELD_BYTES_2, 1));
10880
10881 if (!charm->AddGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
10882 LOG_FATAL("entities.unit", "Unit {} is being charmed, but it already has a charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
10883
10884 _isWalkingBeforeCharm = charm->IsWalking();
10886 {
10887 charm->SetWalk(false);
10888 charm->SendMovementFlagUpdate();
10889 }
10890
10891 m_Controlled.insert(charm);
10892 }
10893 else
10894 {
10895 if (IsPlayer())
10896 {
10897 if (!RemoveGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10898 LOG_FATAL("entities.unit", "Player {} is trying to uncharm unit {}, but it has another charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10899 }
10900
10901 if (!charm->RemoveGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
10902 LOG_FATAL("entities.unit", "Unit {} is being uncharmed, but it has another charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
10903
10904 if (charm->IsPlayer())
10905 {
10906 charm->m_ControlledByPlayer = true;
10907 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10908 charm->ToPlayer()->UpdatePvPState();
10909 }
10910 else if (Player* player = charm->GetCharmerOrOwnerPlayerOrPlayerItself())
10911 {
10912 charm->m_ControlledByPlayer = true;
10913 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10914 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, player->GetByteValue(UNIT_FIELD_BYTES_2, 1));
10915
10916 // Xinef: skip controlled erase if charmed unit is owned by charmer
10917 if (charm->IsInWorld() && !charm->IsDuringRemoveFromWorld() && player->GetGUID() == this->GetGUID() && (charm->IsPet() || charm->HasUnitTypeMask(UNIT_MASK_MINION)))
10918 return;
10919 }
10920 else
10921 {
10922 charm->m_ControlledByPlayer = false;
10923 charm->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10924 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0);
10925 }
10926
10927 if (charm->IsWalking() != _isWalkingBeforeCharm)
10928 {
10929 charm->SetWalk(_isWalkingBeforeCharm);
10930 charm->SendMovementFlagUpdate(true); // send packet to self, to update movement state on player.
10931 }
10932
10933 m_Controlled.erase(charm);
10934 }
10935}
bool AddGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:686
bool RemoveGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:704

References _isWalkingBeforeCharm, Object::AddGuidValue(), Object::GetByteValue(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), WorldObject::GetName(), HasUnitTypeMask(), IsDuringRemoveFromWorld(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), IsWalking(), LOG_FATAL, m_Controlled, m_ControlledByPlayer, Object::RemoveGuidValue(), RemoveUnitFlag(), SendMovementFlagUpdate(), Object::SetByteValue(), SetUnitFlag(), SetWalk(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), UNIT_FIELD_BYTES_2, UNIT_FIELD_CHARM, UNIT_FIELD_CHARMEDBY, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_MASK_MINION, and Player::UpdatePvPState().

Referenced by RemoveCharmedBy(), SetCharmedBy(), and Player::StopCastingCharm().

◆ SetCharmedBy()

bool Unit::SetCharmedBy ( Unit charmer,
CharmType  type,
AuraApplication const *  aurApp = nullptr 
)
18338{
18339 if (!charmer)
18340 return false;
18341
18342 if (!charmer->IsInWorld() || charmer->IsDuringRemoveFromWorld())
18343 {
18344 return false;
18345 }
18346
18347 // dismount players when charmed
18348 if (IsPlayer())
18350
18351 if (charmer->IsPlayer())
18353
18354 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18355 if (type == CHARM_TYPE_VEHICLE && !IsVehicle()) // pussywizard
18356 throw 1;
18357 ASSERT((type == CHARM_TYPE_VEHICLE) == IsVehicle());
18358
18359 LOG_DEBUG("entities.unit", "SetCharmedBy: charmer {} ({}), charmed {} ({}), type {}.",
18360 charmer->GetEntry(), charmer->GetGUID().ToString(), GetEntry(), GetGUID().ToString(), uint32(type));
18361
18362 if (this == charmer)
18363 {
18364 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Unit {} ({}) is trying to charm itself!", GetEntry(), GetGUID().ToString());
18365 return false;
18366 }
18367
18368 //if (HasUnitState(UNIT_STATE_UNATTACKABLE))
18369 // return false;
18370
18371 if (IsPlayer() && ToPlayer()->GetTransport())
18372 {
18373 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Player on transport is trying to charm {} ({})", GetEntry(), GetGUID().ToString());
18374 return false;
18375 }
18376
18377 // Already charmed
18378 if (GetCharmerGUID())
18379 {
18380 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) has already been charmed but {} ({}) is trying to charm it!",
18381 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18382 return false;
18383 }
18384
18385 CastStop();
18386 AttackStop();
18387
18388 // Xinef: dont reset threat and combat, put them on offline list, moved down after faction changes
18389 // CombatStop(); /// @todo: CombatStop(true) may cause crash (interrupt spells)
18390 // DeleteThreatList();
18391
18392 Player* playerCharmer = charmer->ToPlayer();
18393
18394 // Charmer stop charming
18395 if (playerCharmer)
18396 {
18397 playerCharmer->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18398 playerCharmer->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18399 }
18400
18401 // Charmed stop charming
18402 if (IsPlayer())
18403 {
18404 ToPlayer()->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18405 ToPlayer()->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18406 }
18407
18408 // StopCastingCharm may remove a possessed pet?
18409 if (!IsInWorld())
18410 {
18411 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) is not in world but {} ({}) is trying to charm it!",
18412 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18413 return false;
18414 }
18415
18416 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18417 // prevent undefined behaviour
18418 if (aurApp && aurApp->GetRemoveMode())
18419 return false;
18420
18422 SetFaction(charmer->GetFaction());
18423
18424 // Set charmed
18425 charmer->SetCharm(this, true);
18426
18428
18429 if (IsCreature())
18430 {
18431 GetMotionMaster()->Clear(false);
18433 StopMoving();
18434
18435 if (charmer->IsPlayer() && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM) && ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_DEMON)
18436 {
18437 // Disable CreatureAI/SmartAI and switch to CharmAI when charmed by warlock
18438 Creature* charmed = ToCreature();
18439 charmed->NeedChangeAI = true;
18440 charmed->IsAIEnabled = false;
18441 }
18442 else
18443 {
18444 ToCreature()->AI()->OnCharmed(true);
18445 }
18446
18447 // Xinef: If creature can fly, add normal player flying flag (fixes speed)
18448 if (charmer->IsPlayer() && ToCreature()->CanFly())
18450 }
18451 else
18452 {
18453 Player* player = ToPlayer();
18454 if (player->isAFK())
18455 player->ToggleAFK();
18456
18457 player->SetClientControl(this, false); // verified
18458 }
18459
18460 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18461 // prevent undefined behaviour
18462 if (aurApp && aurApp->GetRemoveMode())
18463 return false;
18464
18465 // Pets already have a properly initialized CharmInfo, don't overwrite it.
18466 // Xinef: I need charmInfo for vehicle
18467 if (/*type != CHARM_TYPE_VEHICLE &&*/ !GetCharmInfo())
18468 {
18469 InitCharmInfo();
18470 if (type == CHARM_TYPE_POSSESS)
18472 else if (type != CHARM_TYPE_VEHICLE)
18473 {
18475
18476 // Xinef: convert charm npcs dont have pet bar so initialize them as defensive helpers
18477 if (type == CHARM_TYPE_CONVERT && IsCreature())
18479 }
18480 }
18481
18482 if (playerCharmer)
18483 {
18484 switch (type)
18485 {
18486 case CHARM_TYPE_VEHICLE:
18489 playerCharmer->SetClientControl(this, true); // verified
18490 playerCharmer->VehicleSpellInitialize();
18491 break;
18492 case CHARM_TYPE_POSSESS:
18497 playerCharmer->SetClientControl(this, true); // verified
18498 playerCharmer->PossessSpellInitialize();
18499 break;
18500 case CHARM_TYPE_CHARM:
18502 {
18504 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18505 {
18506 // to prevent client crash
18508
18509 // just to enable stat window
18510 if (GetCharmInfo())
18511 GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
18512
18513 // if charmed two demons the same session, the 2nd gets the 1st one's name
18514 SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped
18515 }
18516 }
18517 if (playerCharmer->m_seer != this)
18518 {
18520 playerCharmer->CharmSpellInitialize();
18521 }
18522 break;
18523 default:
18524 break;
18525 }
18526 }
18527 else if (IsPlayer())
18529
18530 if (Creature* creature = ToCreature())
18531 creature->RefreshSwimmingFlag();
18532
18533 if (IsPlayer())
18534 sScriptMgr->OnPlayerBeingCharmed(ToPlayer(), charmer, _oldFactionId, charmer->GetFaction());
18535
18536 return true;
18537}
@ CHARM_TYPE_CONVERT
Definition: CharmInfo.h:47
@ REACT_DEFENSIVE
Definition: Unit.h:549
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition: UpdateFields.h:133
void OnCharmed(bool apply) override
Called when unit is charmed.
Definition: CreatureAI.cpp:33
void SetReactState(ReactStates state)
A creature can have 3 ReactStates : Agressive, Passive, Neutral.
Definition: Creature.h:97
void CharmSpellInitialize()
Definition: Player.cpp:9643
WorldObject * m_seer
Definition: Player.h:2316
void ToggleAFK()
Definition: Player.cpp:1289
void PossessSpellInitialize()
Definition: Player.cpp:9540
bool isAFK() const
Definition: Player.h:1134
void VehicleSpellInitialize()
Definition: Player.cpp:9568
void StopCastingBindSight(Aura *except=nullptr)
Definition: Player.cpp:13158
void InitPossessCreateSpells()
Definition: CharmInfo.cpp:77
void InitCharmCreateSpells()
Definition: CharmInfo.cpp:98
virtual float GetFollowAngle() const
Definition: Unit.h:1722
CharmInfo * InitCharmInfo()
Definition: Unit.cpp:15798
void MoveIdle()
Definition: MotionMaster.cpp:232

References _oldFactionId, AddUnitMovementFlag(), AddUnitState(), Creature::AI(), ASSERT, AttackStop(), CanFly(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_CONVERT, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, Player::CharmSpellInitialize(), CLASS_CONTEXT_PET_CHARM, CLASS_MAGE, CLASS_WARLOCK, MotionMaster::Clear(), CREATURE_TYPE_DEMON, AuraApplication::GetBase(), GetCharmerGUID(), GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFaction(), GetFollowAngle(), GameTime::GetGameTime(), Object::GetGUID(), GetMotionMaster(), AuraApplication::GetRemoveMode(), WorldObject::GetTransport(), CharmInfo::InitCharmCreateSpells(), InitCharmInfo(), CharmInfo::InitPossessCreateSpells(), Player::isAFK(), IsAIEnabled, IsClass(), Object::IsCreature(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Object::IsPlayer(), IsVehicle(), LOG_DEBUG, LOG_FATAL, Player::m_seer, MotionMaster::MoveFollow(), MotionMaster::MoveIdle(), MOVEMENTFLAG_FLYING, NeedChangeAI, CreatureAI::OnCharmed(), PET_FOLLOW_DIST, Player::PossessSpellInitialize(), REACT_DEFENSIVE, RemoveAurasByType(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), Creature::SetReactState(), SetUInt32Value(), SetUnitFlag(), sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sScriptMgr, StopAttackingInvalidTarget(), Player::StopCastingBindSight(), Player::StopCastingCharm(), StopMoving(), Object::ToCreature(), Player::ToggleAFK(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), CreatureTemplate::type, UNIT_FIELD_BYTES_0, UNIT_FIELD_PET_NAME_TIMESTAMP, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, and Player::VehicleSpellInitialize().

Referenced by Vehicle::AddPassenger(), AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), and Puppet::InitSummon().

◆ SetCharmerGUID()

void Unit::SetCharmerGUID ( ObjectGuid  owner)
inline

◆ SetCombatTimer()

void Unit::SetCombatTimer ( uint32  timer)
inline
831{ m_CombatTimer = timer; }

References m_CombatTimer.

◆ SetConfused()

void Unit::SetConfused ( bool  apply)
protected
18306{
18307 if (apply)
18308 {
18309 SetTarget();
18311 }
18312 else
18313 {
18314 if (IsAlive())
18315 {
18316 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == CONFUSED_MOTION_TYPE)
18317 {
18319 StopMoving();
18320 }
18321
18322 if (GetVictim())
18324 }
18325 }
18326
18327 // xinef: block / allow control to real mover (eg. charmer)
18328 if (IsPlayer())
18329 {
18330 if (m_movedByPlayer)
18331 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18332 //else
18333 // ToPlayer()->SetClientControl(this, !apply);
18334 }
18335}
@ CONFUSED_MOTION_TYPE
Definition: MotionMaster.h:42
void MoveConfused()
Enable the confusion movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:292

References CONFUSED_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveConfused(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), and Object::ToPlayer().

Referenced by SetControlled().

◆ SetContestedPvP()

void Unit::SetContestedPvP ( Player attackedPlayer = nullptr,
bool  lookForNearContestedGuards = true 
)
17236{
17238
17239 if (!player || ((attackedPlayer && (attackedPlayer == player || (player->duel && player->duel->Opponent == attackedPlayer))) || player->InBattleground()))
17240 return;
17241
17242 // check if there any guards that should care about the contested flag on player
17243 if (lookForNearContestedGuards)
17244 {
17245 std::list<Unit*> targets;
17248 Cell::VisitAllObjects(this, searcher, MAX_AGGRO_RADIUS);
17249
17250 // return if there are no contested guards found
17251 if (!targets.size())
17252 {
17253 return;
17254 }
17255 }
17256
17257 player->SetContestedPvPTimer(30000);
17259 {
17262 // call MoveInLineOfSight for nearby contested guards
17264 }
17266 {
17268 // call MoveInLineOfSight for nearby contested guards
17270 }
17271}
#define MAX_AGGRO_RADIUS
Definition: Unit.h:43
void SetPlayerFlag(PlayerFlags flags)
Definition: Player.h:1109
bool InBattleground() const
Definition: Player.h:2234
void SetContestedPvPTimer(uint32 newTime)
Definition: Player.h:1851

References WorldObject::AddToNotify(), AddUnitState(), Player::duel, GetCharmerOrOwnerPlayerOrPlayerItself(), HasUnitState(), Player::InBattleground(), MAX_AGGRO_RADIUS, NOTIFY_AI_RELOCATION, PLAYER_FLAGS_CONTESTED_PVP, Player::SetContestedPvPTimer(), Player::SetPlayerFlag(), UNIT_STATE_ATTACK_PLAYER, and Cell::VisitAllObjects().

Referenced by CombatStart(), CombatStartOnCast(), Spell::DoSpellHitOnUnit(), and WorldSession::HandlePlayerLoginFromDB().

◆ SetControlled()

void Unit::SetControlled ( bool  apply,
UnitState  state,
Unit source = nullptr,
bool  isFear = false 
)
18022{
18023 if (apply)
18024 {
18025 if (HasUnitState(state))
18026 return;
18027
18028 AddUnitState(state);
18029 switch (state)
18030 {
18031 case UNIT_STATE_STUNNED:
18032 SetStunned(true);
18033 break;
18034 case UNIT_STATE_ROOT:
18036 SetRooted(true);
18037 break;
18040 {
18043 // SendAutoRepeatCancel ?
18044 SetConfused(true);
18045 CastStop(0, false);
18046 }
18047 break;
18048 case UNIT_STATE_FLEEING:
18050 {
18053 // SendAutoRepeatCancel ?
18054 SetFeared(true, source, isFear);
18055 CastStop(0, false);
18056 }
18057 break;
18058 default:
18059 break;
18060 }
18061
18062 if (IsPlayer())
18063 {
18064 sScriptMgr->AnticheatSetRootACKUpd(ToPlayer());
18065 }
18066 }
18067 else
18068 {
18069 // xinef: moved from below, checked all SetX functions, no calls to currently modified state
18070 // xinef: added to each case because of return
18071 //ClearUnitState(state);
18072
18073 switch (state)
18074 {
18075 case UNIT_STATE_STUNNED:
18077 return;
18078 ClearUnitState(state);
18079 SetStunned(false);
18080 break;
18081 case UNIT_STATE_ROOT:
18082 // Prevent creature_template_movement rooted flag from being removed on aura expiration.
18083 if (IsCreature())
18084 {
18085 if (ToCreature()->GetCreatureTemplate()->Movement.Rooted)
18086 {
18087 return;
18088 }
18089 }
18090
18092 return;
18093 ClearUnitState(state);
18094 SetRooted(false);
18095 break;
18098 return;
18099 ClearUnitState(state);
18100 SetConfused(false);
18101 break;
18102 case UNIT_STATE_FLEEING:
18104 return;
18105 ClearUnitState(state);
18106 SetFeared(false);
18107 break;
18108 default:
18109 return;
18110 }
18111
18112 //ClearUnitState(state);
18113
18115 SetStunned(true);
18116 else
18117 {
18119 SetRooted(true);
18120
18122 SetConfused(true);
18124 {
18125 bool isFear = false;
18127 {
18128 isFear = true;
18129 source = ObjectAccessor::GetUnit(*this, GetAuraEffectsByType(SPELL_AURA_MOD_FEAR).front()->GetCasterGUID());
18130 }
18131
18132 if (!source)
18133 {
18134 source = getAttackerForHelper();
18135 }
18136
18137 SetFeared(true, source, isFear);
18138 }
18139 }
18140 }
18141}
Definition: Unit.h:257
void SetFeared(bool apply, Unit *fearedBy=nullptr, bool isFear=false)
Definition: Unit.cpp:18273
void SetConfused(bool apply)
Definition: Unit.cpp:18305
void SetStunned(bool apply)
Definition: Unit.cpp:18143
Unit * getAttackerForHelper() const
Definition: Unit.cpp:740
void SetRooted(bool apply, bool isStun=false)
Definition: Unit.cpp:18191

References AddUnitState(), CastStop(), ClearUnitState(), getAttackerForHelper(), GetAuraEffectsByType(), ObjectAccessor::GetUnit(), GetVehicle(), HasAuraType(), HasUnitState(), Object::IsCreature(), Object::IsPlayer(), SendMeleeAttackStop(), SetConfused(), SetFeared(), SetRooted(), SetStunned(), SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, UNIT_STATE_MELEE_ATTACKING, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by _ExitVehicle(), Vehicle::AddPassenger(), boss_ahune::boss_ahune(), boss_ouro::boss_ouro(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_palehoof::boss_palehoofAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), Creature::DoFleeToGetAssistance(), boss_skeram::DoTeleport(), CritterAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_falric::boss_falricAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_noth::boss_nothAI::EnterEvadeMode(), boss_thaddius_summon::boss_thaddius_summonAI::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::EnterEvadeMode(), boss_svala::boss_svalaAI::EnterEvadeMode(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_shirrak_the_dead_watcher::EnterEvadeMode(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleAuraModRoot(), AuraEffect::HandleAuraModStun(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_gen_visual_dummy_stun::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_gen_visual_dummy_stun::HandleEffectRemove(), AuraEffect::HandleModConfuse(), AuraEffect::HandleModFear(), AuraEffect::HandlePreventFleeing(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_volazj::JustDied(), CritterAI::JustEngagedWith(), boss_skadi::boss_skadiAI::JustEngagedWith(), boss_skeram::JustSummoned(), npc_twilight_volunteer::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), npc_gunship_gunner::npc_gunship_gunnerAI::MovementInform(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_iron_watcher::npc_iron_watcherAI::MovementInform(), npc_buru_egg::npc_buru_egg(), npc_icc_blood_beast::npc_icc_blood_beastAI::npc_icc_blood_beastAI(), npc_raging_spirit::npc_raging_spiritAI::npc_raging_spiritAI(), npc_vengeful_shade::npc_vengeful_shadeAI::npc_vengeful_shadeAI(), spell_systems_shutdown_aura::OnApply(), spell_systems_shutdown_aura::OnRemove(), npc_akama_illidan::PathEndReached(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_skeram::Reset(), boss_volazj::Reset(), npc_twilight_summon::npc_twilight_summonAI::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_thaddius_summon::boss_thaddius_summonAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_thorim_pillar::boss_thorim_pillarAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), boss_skadi::boss_skadiAI::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), npc_iron_watcher::npc_iron_watcherAI::Reset(), boss_shirrak_the_dead_watcher::Reset(), boss_illidan_stormrage::Reset(), npc_akama_illidan::Reset(), npc_target_dummy::npc_target_dummyAI::Reset(), boss_illidan_stormrage::ScheduleAbilities(), Player::SetClientControl(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_ionar::boss_ionarAI::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_noth::boss_nothAI::StartGroundPhase(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonedCreatureDies(), boss_skeram::UpdateAI(), boss_volazj::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), npc_icc_blood_beast::npc_icc_blood_beastAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ SetCreateHealth()

◆ SetCreateMana()

◆ SetCreateStat()

void Unit::SetCreateStat ( Stats  stat,
float  val 
)
inline

◆ SetCreatorGUID()

◆ SetCritterGUID()

void Unit::SetCritterGUID ( ObjectGuid  guid)
inline

References Object::SetGuidValue(), and UNIT_FIELD_CRITTER.

Referenced by SetMinion().

◆ SetCurrentCastedSpell()

void Unit::SetCurrentCastedSpell ( Spell pSpell)
3958{
3959 ASSERT(pSpell); // nullptr may be never passed here, use InterruptSpell or InterruptNonMeleeSpells
3960
3961 CurrentSpellTypes CSpellType = pSpell->GetCurrentContainer();
3962
3963 if (pSpell == m_currentSpells[CSpellType]) // avoid breaking self
3964 return;
3965
3966 bool bySelf = m_currentSpells[CSpellType] && m_currentSpells[CSpellType]->m_spellInfo->Id == pSpell->m_spellInfo->Id;
3967
3968 // break same type spell if it is not delayed
3969 InterruptSpell(CSpellType, false, true, bySelf);
3970
3971 // special breakage effects:
3972 switch (CSpellType)
3973 {
3975 {
3976 // generic spells always break channeled not delayed spells
3978 {
3979 if (!s->GetSpellInfo()->IsActionAllowedChannel())
3980 {
3982 }
3983 }
3984
3985 // autorepeat breaking
3987 {
3988 // break autorepeat if not Auto Shot
3989 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
3991 m_AutoRepeatFirstCast = true;
3992 }
3993
3994 // melee spells breaking
3996 {
3997 // break melee spells if cast time
3998 if (pSpell->GetCastTime() > 0)
3999 {
4001 }
4002 }
4003 if (pSpell->GetCastTime() > 0)
4005
4006 break;
4007 }
4009 {
4010 // channel spells always break generic non-delayed and any channeled spells
4012 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4013
4014 // it also does break autorepeat if not Auto Shot
4016 m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4019
4020 break;
4021 }
4023 {
4024 // only Auto Shoot does not break anything
4025 if (pSpell->m_spellInfo->Id != 75)
4026 {
4027 // generic autorepeats break generic non-delayed and channeled non-delayed spells
4029 {
4030 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4031 {
4033 }
4034 }
4035
4037 }
4038 // special action: set first cast flag
4039 m_AutoRepeatFirstCast = true;
4040
4041 break;
4042 }
4043
4044 default:
4045 // other spell types don't break anything now
4046 break;
4047 }
4048
4049 // current spell (if it is still here) may be safely deleted now
4050 if (m_currentSpells[CSpellType])
4051 m_currentSpells[CSpellType]->SetReferencedFromCurrent(false);
4052
4053 // set new current spell
4054 m_currentSpells[CSpellType] = pSpell;
4055 pSpell->SetReferencedFromCurrent(true);
4056
4057 pSpell->m_selfContainer = &(m_currentSpells[pSpell->GetCurrentContainer()]);
4058}
CurrentSpellTypes GetCurrentContainer() const
Definition: Spell.cpp:7911
Spell ** m_selfContainer
Definition: Spell.h:610

References AddUnitState(), ASSERT, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, CURRENT_MELEE_SPELL, Spell::GetCastTime(), Spell::GetCurrentContainer(), GetCurrentSpell(), SpellInfo::Id, InterruptSpell(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_selfContainer, Spell::m_spellInfo, Spell::SetReferencedFromCurrent(), and UNIT_STATE_CASTING.

Referenced by Spell::prepare().

◆ setDeathState()

void Unit::setDeathState ( DeathState  s,
bool  despawn = false 
)
virtual

Reimplemented in Creature, Minion, Pet, and Player.

14540{
14541 // death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that
14542 // it can be used to check creation of death items (such as soul shards).
14543 m_deathState = s;
14544
14545 if (s != DeathState::Alive && s != DeathState::JustRespawned)
14546 {
14547 CombatStop();
14550 ClearComboPointHolders(); // any combo points pointed to unit lost at it death
14551
14552 if (IsNonMeleeSpellCast(false))
14554
14555 UnsummonAllTotems(true);
14556 RemoveAllControlled(true);
14558 }
14559
14560 if (s == DeathState::JustDied)
14561 {
14562 // remove aurastates allowing special moves
14565
14566 GetMotionMaster()->Clear(false);
14568
14569 // Xinef: Remove Hover so the corpse can fall to the ground
14570 SetHover(false);
14571
14572 if (despawn)
14573 DisableSpline();
14574 else
14575 StopMoving();
14576
14577 // without this when removing IncreaseMaxHealth aura player may stuck with 1 hp
14578 // do not why since in IncreaseMaxHealth currenthealth is checked
14579 SetHealth(0);
14580 SetPower(getPowerType(), 0);
14581
14582 // Stop emote on death
14584
14585 // players in instance don't have ZoneScript, but they have InstanceScript
14587 zoneScript->OnUnitDeath(this);
14588 }
14589 else if (s == DeathState::JustRespawned)
14590 {
14591 RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
14592 }
14593}
@ UNIT_FLAG_SKINNABLE
Definition: UnitDefines.h:255
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1192
ZoneScript * GetZoneScript() const
Definition: Object.h:537
void ClearAllReactives()
Definition: Unit.cpp:16914
virtual bool SetHover(bool enable, bool packetOnly=false, bool updateAnimationTier=true)
Definition: Unit.cpp:20660
void ClearDiminishings()
Definition: Unit.h:932
Definition: ZoneScript.h:27

References MotionMaster::Clear(), ClearAllReactives(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearDiminishings(), CombatStop(), HostileRefMgr::deleteReferences(), DisableSpline(), getHostileRefMgr(), WorldObject::GetInstanceScript(), GetMotionMaster(), getPowerType(), GetThreatMgr(), WorldObject::GetZoneScript(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), m_deathState, MotionMaster::MoveIdle(), RemoveAllAurasOnDeath(), RemoveAllControlled(), Object::RemoveFlag(), SetHealth(), SetHover(), SetPower(), SetUInt32Value(), StopMoving(), UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE, UNIT_NPC_EMOTESTATE, and UnsummonAllTotems().

Referenced by _ExitVehicle(), KillMagnetEvent::Execute(), Spell::finish(), WorldSession::HandlePetActionHelper(), AuraEffect::HandleSpiritOfRedemption(), Kill(), Creature::setDeathState(), and Player::setDeathState().

◆ SetDisableGravity()

◆ SetDisplayId()

◆ SetExtraUnitMovementFlags()

void Unit::SetExtraUnitMovementFlags ( uint16  f)
inline

◆ SetFacingTo()

void Unit::SetFacingTo ( float  ori)
20515{
20516 Movement::MoveSplineInit init(this);
20517 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false);
20519 init.DisableTransportPathTransformations(); // It makes no sense to target global orientation
20520 init.SetFacing(ori);
20521 init.Launch();
20522}
ObjectGuid GetTransGUID() const override
Definition: Unit.cpp:18743

References Movement::MoveSplineInit::DisableTransportPathTransformations(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTransGUID(), HasUnitMovementFlag(), Movement::MoveSplineInit::Launch(), MOVEMENTFLAG_ONTRANSPORT, Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_twinemperorsAI::DoAction(), npc_arthas::npc_arthasAI::DoAction(), Spell::EffectDistract(), UtherBatteredHiltEvent::Execute(), DistractMovementGenerator::Finalize(), Creature::FocusTarget(), spell_item_unusual_compass::HandleDummy(), spell_drakkari_colossus_face_me::HandleScriptEffect(), boss_grand_warlock_nethekurse::IntroRP(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::JustDied(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::JustSummoned(), boss_nalorakk::MoveInLineOfSight(), boss_algalon_the_observer::boss_algalon_the_observerAI::MovementInform(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::MovementInform(), boss_onyxia::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_eadric::boss_eadricAI::MovementInform(), boss_paletress::boss_paletressAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::MovementInform(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_essence_of_suffering::boss_essence_of_sufferingAI::MovementInform(), boss_essence_of_desire::boss_essence_of_desireAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), boss_felmyst::boss_felmystAI::MovementInform(), boss_saviana_ragefire::boss_saviana_ragefireAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), spell_lurker_below_spout::OnPeriodic(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), SmartAI::PausePath(), SmartScript::ProcessAction(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), boss_illidan_stormrage::ScheduleAbilities(), boss_nightbane::ScheduleFly(), Player::SetClientControl(), boss_grand_warlock_nethekurse::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_chesspiece::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), CreatureAI::TriggerAlert(), RotateMovementGenerator::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_harrison_jones::npc_harrison_jonesAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), boss_onyxia::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_general_andorov::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), npc_argent_soldier::npc_argent_soldierAI::WaypointReached(), npc_ranger_lilatha::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetFacingToObject()

void Unit::SetFacingToObject ( WorldObject object)
Todo:
figure out under what conditions creature will move towards object instead of facing it where it currently is.
20525{
20526 // never face when already moving
20527 if (!IsStopped())
20528 return;
20529
20531 Movement::MoveSplineInit init(this);
20532 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
20533 init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming
20534 init.Launch();
20535}
bool IsStopped() const
Definition: Unit.h:1619

References Position::GetAngle(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsStopped(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), npc_ranshalla::npc_ranshallaAI::DoChannelTorchSpell(), spell_yogg_saron_target_selectors::HandleScript(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_maiev_illidan::IsSummonedBy(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_illidan_stormrage::JustSummoned(), npc_drakuru_shackles::npc_drakuru_shacklesAI::LockRageclaw(), npc_mograine::npc_mograineAI::MoveInLineOfSight(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), npc_akama_illidan::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), npc_image_of_medivh::npc_image_of_medivhAI::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_nightbane::ScheduleFly(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), boss_the_lurker_below::SchedulerPhaseOne(), boss_shade_of_aran::SetGUID(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::SetGUID(), npc_harrison_jones::npc_harrison_jonesAI::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_death_knight_initiate::npc_death_knight_initiateAI::SpellHit(), npc_forest_frog::npc_forest_frogAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_magister_aledis::StartFight(), boss_hydross_the_unstable::SummonMovementInform(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_pilgrims_bounty_chair::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_hidden_cultist::npc_hidden_cultistAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI(), npc_ranshalla::npc_ranshallaAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), npc_scarlet_miner::npc_scarlet_minerAI::WaypointReached(), and npc_kaya_flathoof::npc_kaya_flathoofAI::WaypointReached().

◆ SetFaction()

void Unit::SetFaction ( uint32  faction)
10048{
10050 if (IsCreature())
10052}
void UpdateMoveInLineOfSightState()
Definition: Creature.cpp:2587

References Object::IsCreature(), SetUInt32Value(), Object::ToCreature(), UNIT_FIELD_FACTIONTEMPLATE, and Creature::UpdateMoveInLineOfSightState().

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), npc_hidden_cultist::npc_hidden_cultistAI::AttackPlayer(), GameObject::CastSpell(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSummonType(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), BattlegroundEY::EventTeamCapturedPoint(), AuraEffect::HandleAuraModFaction(), BattlegroundIC::HandleCapturedNodes(), spell_q12096_q12092_dummy::HandleDummy(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFactionIdCommand(), npc_commandscript::HandleNpcSetFactionTempIdCommand(), spell_mutate_explode_bug::HandleOnHit(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_item_draenic_pale_ale::HandleSummon(), npc_cork_gizelton::npc_cork_gizeltonAI::ImmuneFlagSet(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_general_andorov::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), Minion::InitStats(), TempSummon::InitStats(), InitTamedPet(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), FollowerAI::JustRespawned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_volkhan::boss_volkhanAI::JustSummoned(), boss_balinda::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), Pet::LoadPetFromDB(), npc_mograine::npc_mograineAI::MoveInLineOfSight(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), boss_twilight_corrupter::MoveInLineOfSight(), npc_akama_shade::MovementInform(), BattlegroundAB::NodeOccupied(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), spell_brewfest_reveler_transform::OnApply(), npc_chesspiece::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_nexus::instance_nexus_InstanceMapScript::OnCreatureCreate(), instance_black_temple::instance_black_temple_InstanceMapScript::OnCreatureCreate(), boss_azuregos::OnGossipSelect(), npc_prospector_remtravel::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_lakota_windsong::OnQuestAccept(), npc_paoka_swiftmountain::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_maxx_a_million_escort::OnQuestAccept(), npc_kaya_flathoof::OnQuestAccept(), npc_wizzlecrank_shredder::OnQuestAccept(), npc_ame::OnQuestAccept(), npc_ranshalla::OnQuestAccept(), npc_lurgglbr::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_apothecary_hanes::OnQuestAccept(), npc_bessy::OnQuestAccept(), npc_isla_starmane::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), BattlegroundAV::PopulateNode(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), RemoveCharmedBy(), boss_doomrel::boss_doomrelAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_coren_direbrew::Reset(), npc_direbrew_minion::Reset(), npc_aquementas::npc_aquementasAI::Reset(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), npc_captured_rageclaw::npc_captured_rageclawAI::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), RestoreFaction(), SetCharmedBy(), Player::SetFactionForRace(), Player::SetGameMaster(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), BattlegroundIC::SetupBattleground(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::SpawnCreature(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_professor_phizzlethorpe::npc_professor_phizzlethorpeAI::sQuestAccept(), npc_ranger_lilatha::sQuestAccept(), npc_corporal_keeshan::npc_corporal_keeshanAI::sQuestAccept(), npc_muglash::npc_muglashAI::sQuestAccept(), npc_wounded_blood_elf::npc_wounded_blood_elfAI::sQuestAccept(), FollowerAI::StartFollow(), pyrewood_ambush::pyrewood_ambushAI::SummonCreatureWithRandomTarget(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), Spell::SummonGuardian(), Player::SummonPet(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), WorldObject::SummonTrigger(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), npc_sergeant_bly::npc_sergeant_blyAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_magister_aledis::UpdateAI(), npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI::UpdateAI(), Creature::UpdateEntry(), npc_magwin::npc_magwinAI::UpdateEscortAI(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ SetFeared()

void Unit::SetFeared ( bool  apply,
Unit fearedBy = nullptr,
bool  isFear = false 
)
protected
18274{
18275 if (apply)
18276 {
18277 SetTarget();
18278 GetMotionMaster()->MoveFleeing(fearedBy, isFear ? 0 : sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_FLEE_DELAY));
18279 }
18280 else
18281 {
18282 if (IsAlive())
18283 {
18284 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == FLEEING_MOTION_TYPE)
18285 {
18287 StopMoving();
18288 }
18289
18290 if (GetVictim())
18292 }
18293 }
18294
18295 // xinef: block / allow control to real mover (eg. charmer)
18296 if (IsPlayer())
18297 {
18298 if (m_movedByPlayer)
18299 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18300 //else
18301 // ToPlayer()->SetClientControl(this, !apply);
18302 }
18303}
@ CONFIG_CREATURE_FAMILY_FLEE_DELAY
Definition: IWorld.h:284
@ FLEEING_MOTION_TYPE
Definition: MotionMaster.h:47
void MoveFleeing(Unit *enemy, uint32 time=0)
Enable the target's fleeing movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:746

References CONFIG_CREATURE_FAMILY_FLEE_DELAY, FLEEING_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveFleeing(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), sWorld, and Object::ToPlayer().

Referenced by SetControlled().

◆ SetFeatherFall()

bool Unit::SetFeatherFall ( bool  enable,
bool  packetOnly = false 
)
virtual

Reimplemented in Player, and Creature.

20639{
20641 return false;
20642
20643 if (enable)
20645 else
20647
20648 return true;
20649}
@ MOVEMENTFLAG_FALLING_SLOW
Definition: UnitDefines.h:373

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_FALLING_SLOW, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraFeatherFall(), debug_commandscript::HandleDebugMoveflagsCommand(), Player::SetFeatherFall(), and Creature::SetFeatherFall().

◆ SetFullHealth()

◆ SetHealth()

void Unit::SetHealth ( uint32  val)
15465{
15466 if (getDeathState() == DeathState::JustDied)
15467 val = 0;
15468 else if (IsPlayer() && getDeathState() == DeathState::Dead)
15469 val = 1;
15470 else
15471 {
15472 uint32 maxHealth = GetMaxHealth();
15473 if (maxHealth < val)
15474 val = maxHealth;
15475 }
15476
15477 float prevHealthPct = GetHealthPct();
15478
15480
15481 // mobs that are now or were below 30% need to update their speed
15482 if (IsCreature() && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30)))
15483 {
15484 UpdateSpeed(MOVE_RUN, false);
15485 }
15486
15487 // group update
15488 if (IsPlayer())
15489 {
15490 Player* player = ToPlayer();
15491 if (player->NeedSendSpectatorData())
15493
15494 if (player->GetGroup())
15496 }
15497 else if (Pet* pet = ToCreature()->ToPet())
15498 {
15499 if (pet->isControlled())
15500 {
15501 if (Unit* owner = GetOwner())
15502 if (Player* player = owner->ToPlayer())
15503 {
15504 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15505 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15506
15507 if (player->GetGroup())
15509 }
15510 }
15511 }
15512}
@ GROUP_UPDATE_FLAG_CUR_HP
Definition: Group.h:101
@ GROUP_UPDATE_FLAG_PET_CUR_HP
Definition: Group.h:113
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition: ArenaSpectator.h:62
bool NeedSendSpectatorData() const
Definition: Player.cpp:15405
void SetGroupUpdateFlag(uint32 flag)
Definition: Player.h:2456
float GetHealthPct() const
Definition: Unit.h:877

References WorldObject::FindMap(), getDeathState(), Player::GetGroup(), Object::GetGUID(), GetHealthPct(), GetMaxHealth(), GetOwner(), GROUP_UPDATE_FLAG_CUR_HP, GROUP_UPDATE_FLAG_PET_CUR_HP, HealthBelowPct(), IsControlledByPlayer(), Object::IsCreature(), IsPet(), Object::IsPlayer(), MOVE_RUN, Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_HEALTH, and UpdateSpeed().

Referenced by boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), Player::BuildPlayerRepop(), npc_mograine::npc_mograineAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Spell::EffectSummonType(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), boss_halazzi::EnterPhase(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_oculus_soar_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyHPCommand(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcSetLevelCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), npc_echo_of_medivh::HandlePieceJustDied(), spell_stinky_precious_decimate::HandleScript(), spell_ahune_synch_health::HandleScript(), AuraEffect::HandleSpiritOfRedemption(), npc_pet_pri_lightwell::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustReachedHome(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustReachedHome(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_nether_drake::npc_nether_drakeAI::MovementInform(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Player::ProcessDelayedOperations(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_kalecgos::boss_kalecgosAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetAllPowers(), Player::RestoreHealthAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetFullHealth(), SetMaxHealth(), boss_headless_horseman::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ SetHover()

bool Unit::SetHover ( bool  enable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
virtual

Reimplemented in Creature, and Player.

20661{
20663 return false;
20664
20665 float hoverHeight = GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
20666
20667 if (enable)
20668 {
20670 if (hoverHeight && GetPositionZ() - GetFloorZ() < hoverHeight)
20671 UpdateHeight(GetPositionZ() + hoverHeight);
20672 }
20673 else
20674 {
20676 if (hoverHeight && (!isDying() || !IsCreature()))
20677 {
20678 float newZ = std::max<float>(GetFloorZ(), GetPositionZ() - hoverHeight);
20680 UpdateHeight(newZ);
20681 }
20682 SendMovementFlagUpdate(); // pussywizard: needed for falling after death (instead of falling onto air at hover height)
20683 }
20684
20685 return true;
20686}
void UpdateAllowedPositionZ(float x, float y, float &z, float *groundZ=nullptr) const
Definition: Object.cpp:1554
float GetFloorZ() const
Definition: Object.cpp:3135
void UpdateHeight(float newZ)
Only server-side height update, does not broadcast to client.
Definition: Unit.cpp:20058
void SendMovementFlagUpdate(bool self=false)
Definition: Unit.cpp:16691
bool isDying() const
Definition: Unit.h:1217

References AddUnitMovementFlag(), Object::GetFloatValue(), WorldObject::GetFloorZ(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), HasUnitMovementFlag(), Object::IsCreature(), isDying(), MOVEMENTFLAG_HOVER, RemoveUnitMovementFlag(), SendMovementFlagUpdate(), UNIT_FIELD_HOVERHEIGHT, WorldObject::UpdateAllowedPositionZ(), and UpdateHeight().

Referenced by AuraEffect::HandleAuraHover(), debug_commandscript::HandleDebugMoveflagsCommand(), setDeathState(), Creature::SetHover(), and Player::SetHover().

◆ SetImmuneToAll()

void Unit::SetImmuneToAll ( bool  apply,
bool  keepCombat = false 
)
inline
810{ SetImmuneToPC(apply, keepCombat); SetImmuneToNPC(apply, keepCombat); }
void SetImmuneToNPC(bool apply, bool keepCombat=false)
Definition: Unit.cpp:13606

References SetImmuneToNPC(), and SetImmuneToPC().

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), boss_chromaggus::boss_chromaggusAI::boss_chromaggusAI(), boss_nalorakk::boss_nalorakk(), boss_felblood_kaelthas::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_broggok::DoAction(), boss_grand_warlock_nethekurse::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_ambassador_hellmaw::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), boss_skeram::DoTeleport(), Spell::EffectSummonType(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), spell_uldaman_stoned::spell_uldaman_stoned_AuraScript::HandleEffectApply(), spell_uldaman_stoned::spell_uldaman_stoned_AuraScript::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_item_draenic_pale_ale::HandleSummon(), boss_majordomo::boss_majordomoAI::InitializeAI(), boss_felblood_kaelthas::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_taldaram::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::InitializeAI(), Player::InitStatsForLevel(), boss_falric::boss_falricAI::JustEngagedWith(), boss_marwyn::boss_marwynAI::JustEngagedWith(), boss_moroes::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_rinji::npc_rinjiAI::JustRespawned(), npc_isla_starmane::npc_isla_starmaneAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_skeram::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), boss_captain_skarloc::MovementInform(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MovementInform(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_memory::npc_memoryAI::npc_memoryAI(), npc_rinji::npc_rinjiAI::npc_rinjiAI(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_felblood_kaelthas::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_skeram::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_marwyn::boss_marwynAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), boss_svala::boss_svalaAI::Reset(), npc_thassarian::npc_thassarianAI::Reset(), boss_ambassador_hellmaw::Reset(), boss_broggok::Reset(), boss_grand_warlock_nethekurse::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_svala::boss_svalaAI::SetData(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_chromaggus::boss_chromaggusAI::SetGUID(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_rinji::npc_rinjiAI::sQuestAccept(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_skeram::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_anzu::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), and npc_franklin::npc_franklinAI::UpdateAI().

◆ SetImmuneToNPC()

void Unit::SetImmuneToNPC ( bool  apply,
bool  keepCombat = false 
)

◆ SetImmuneToPC()

void Unit::SetImmuneToPC ( bool  apply,
bool  keepCombat = false 
)
13598{
13599 (void)keepCombat;
13600 if (apply)
13602 else
13604}

References RemoveUnitFlag(), SetUnitFlag(), and UNIT_FLAG_IMMUNE_TO_PC.

Referenced by boss_victor_nefarius::boss_victor_nefariusAI::BeginEvent(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), ClearInCombat(), npc_magister_aledis::DamageTaken(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectRemove(), boss_blackheart_the_inciter::JustEngagedWith(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::JustSummoned(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), npc_omen::npc_omenAI::MovementInform(), npc_omen::npc_omenAI::npc_omenAI(), npc_death_knight_initiate::OnGossipSelect(), instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), npc_kaya_flathoof::OnQuestAccept(), boss_doomrel::boss_doomrelAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_julianne::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_a_special_surprise::npc_a_special_surpriseAI::Reset(), npc_coren_direbrew::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), boss_blackheart_the_inciter::Reset(), boss_magtheridon::Reset(), npc_magister_aledis::Reset(), boss_magtheridon::ScheduleCombatEvents(), SetImmuneToAll(), SetInCombatState(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_magister_aledis::UpdateAI(), and npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI().

◆ SetInCombatState()

void Unit::SetInCombatState ( bool  PvP,
Unit enemy = nullptr,
uint32  duration = 0 
)
13719{
13720 // only alive units can be in combat
13721 if (!IsAlive())
13722 return;
13723
13724 if (PvP)
13725 m_CombatTimer = std::max<uint32>(GetCombatTimer(), std::max<uint32>(5500, duration));
13726 else if (duration)
13727 m_CombatTimer = std::max<uint32>(GetCombatTimer(), duration);
13728
13730 return;
13731
13732 // xinef: if we somehow engage in combat (scripts, dunno) with player, remove this flag so he can fight back
13733 if (IsCreature() && enemy && IsImmuneToPC() && enemy->GetCharmerOrOwnerPlayerOrPlayerItself())
13734 SetImmuneToPC(false); // unit has engaged in combat, remove immunity so players can fight back
13735
13736 if (IsInCombat())
13737 return;
13738
13740
13741 if (Creature* creature = ToCreature())
13742 {
13743 // Set home position at place of engaging combat for escorted creatures
13744 if ((IsAIEnabled && creature->AI()->IsEscorted()) ||
13745 GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE ||
13746 GetMotionMaster()->GetCurrentMovementGeneratorType() == ESCORT_MOTION_TYPE)
13747 creature->SetHomePosition(GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
13748
13749 if (enemy)
13750 {
13751 creature->UpdateLeashExtensionTime();
13752
13753 if (IsAIEnabled)
13754 creature->AI()->JustEngagedWith(enemy);
13755
13756 if (creature->GetFormation())
13757 creature->GetFormation()->MemberEngagingTarget(creature, enemy);
13758
13759 sScriptMgr->OnUnitEnterCombat(creature, enemy);
13760 }
13761
13762 creature->RefreshSwimmingFlag();
13763
13764 if (IsPet())
13765 {
13766 UpdateSpeed(MOVE_RUN, true);
13767 UpdateSpeed(MOVE_SWIM, true);
13768 UpdateSpeed(MOVE_FLIGHT, true);
13769 }
13770
13771 if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT))
13772 Dismount();
13773 if (!IsStandState()) // pussywizard: already done in CombatStart(target, initialAggro) for the target, but when aggro'ing from MoveInLOS CombatStart is not called!
13775 }
13776
13777 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
13778 {
13779 Unit* controlled = *itr;
13780 ++itr;
13781
13782 // Xinef: Dont set combat for passive units, they will evade in next update...
13783 if (controlled->IsCreature() && controlled->ToCreature()->HasReactState(REACT_PASSIVE))
13784 continue;
13785
13786 controlled->SetInCombatState(PvP, enemy, duration);
13787 }
13788
13789 if (Player* player = this->ToPlayer())
13790 {
13791 sScriptMgr->OnPlayerEnterCombat(player, enemy);
13792 }
13793}
@ MOVE_FLIGHT
Definition: UnitDefines.h:334
@ MOVE_SWIM
Definition: UnitDefines.h:331
@ ESCORT_MOTION_TYPE
Definition: MotionMaster.h:55
@ WAYPOINT_MOTION_TYPE
Definition: MotionMaster.h:39
@ CREATURE_TYPE_NON_COMBAT_PET
Definition: SharedDefines.h:2639
@ CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT
Definition: SharedDefines.h:2706
bool HasReactState(ReactStates state) const
Definition: Creature.h:99
uint32 GetCombatTimer() const
Definition: Unit.h:830
void SetInCombatState(bool PvP, Unit *enemy=nullptr, uint32 duration=0)
Definition: Unit.cpp:13718
bool IsStandState() const
Definition: Unit.cpp:16707

References CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT, CREATURE_TYPE_NON_COMBAT_PET, Dismount(), ESCORT_MOTION_TYPE, GetCharmerOrOwnerPlayerOrPlayerItself(), GetCombatTimer(), GetCreatureType(), GetMotionMaster(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Creature::HasReactState(), HasUnitState(), IsAIEnabled, IsAlive(), Object::IsCreature(), IsImmuneToPC(), IsInCombat(), IsPet(), IsStandState(), m_CombatTimer, m_Controlled, MOVE_FLIGHT, MOVE_RUN, MOVE_SWIM, REACT_PASSIVE, SetImmuneToPC(), SetInCombatState(), SetStandState(), SetUnitFlag(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_IN_COMBAT, UNIT_STAND_STATE_STAND, UNIT_STATE_EVADE, UpdateSpeed(), and WAYPOINT_MOTION_TYPE.

Referenced by Spell::DoSpellHitOnUnit(), SetInCombatState(), and SetInCombatWith().

◆ SetInCombatWith()

void Unit::SetInCombatWith ( Unit enemy,
uint32  duration = 0 
)
13568{
13569 // Xinef: Dont allow to start combat with triggers
13570 if (enemy->IsCreature() && enemy->ToCreature()->IsTrigger())
13571 return;
13572
13573 Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf();
13574 if (eOwner->IsPvP() || eOwner->IsFFAPvP())
13575 {
13576 SetInCombatState(true, enemy, duration);
13577 return;
13578 }
13579
13580 // check for duel
13581 if (eOwner->IsPlayer() && eOwner->ToPlayer()->duel)
13582 {
13583 Unit const* myOwner = GetCharmerOrOwnerOrSelf();
13584 if (((Player const*)eOwner)->duel->Opponent == myOwner)
13585 {
13586 SetInCombatState(true, enemy, duration);
13587 return;
13588 }
13589 }
13590
13591 if (Creature* pCreature = ToCreature())
13592 pCreature->UpdateLeashExtensionTime();
13593
13594 SetInCombatState(false, enemy, duration);
13595}

References Player::duel, GetCharmerOrOwnerOrSelf(), Object::IsCreature(), IsFFAPvP(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), SetInCombatState(), Object::ToCreature(), and Object::ToPlayer().

Referenced by Attack(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), CombatStart(), CombatStartOnCast(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), Spell::DoAllEffectOnTarget(), CreatureAI::DoZoneInCombat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), spell_herald_volzaj_insanity::HandleDummyEffect(), boss_chromaggus::boss_chromaggusAI::PathEndReached(), SmartScript::ProcessAction(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), and npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI().

◆ SetInFront()

◆ SetInstantCast()

void Unit::SetInstantCast ( bool  set)
inline
1759{ _instantCast = set; }

References _instantCast.

Referenced by AuraEffect::HandleModCastingSpeed().

◆ SetLastDamagedTargetGuid()

void Unit::SetLastDamagedTargetGuid ( ObjectGuid const &  guid)
inline

◆ SetLastExtraAttackSpell()

void Unit::SetLastExtraAttackSpell ( uint32  spellId)
inline
1017{ _lastExtraAttackSpell = spellId; }

References _lastExtraAttackSpell.

Referenced by Spell::_handle_finish_phase().

◆ SetLastManaUse()

void Unit::SetLastManaUse ( uint32  spellCastTime)
inline
1570{ m_lastManaUse = spellCastTime; }

References m_lastManaUse.

Referenced by Spell::TakePower().

◆ SetLevel()

void Unit::SetLevel ( uint8  lvl,
bool  showLevelChange = true 
)

◆ SetMaxHealth()

void Unit::SetMaxHealth ( uint32  val)
15515{
15516 if (!val)
15517 val = 1;
15518
15519 uint32 health = GetHealth();
15521
15522 // group update
15523 if (IsPlayer())
15524 {
15525 Player* player = ToPlayer();
15526 if (player->NeedSendSpectatorData())
15528
15529 if (player->GetGroup())
15531 }
15532 else if (Pet* pet = ToCreature()->ToPet())
15533 {
15534 if (pet->isControlled())
15535 {
15536 if (Unit* owner = GetOwner())
15537 if (Player* player = owner->ToPlayer())
15538 {
15539 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15540 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15541
15542 if (player->GetGroup())
15544 }
15545 }
15546 }
15547
15548 if (val < health)
15549 SetHealth(val);
15550}
@ GROUP_UPDATE_FLAG_MAX_HP
Definition: Group.h:102
@ GROUP_UPDATE_FLAG_PET_MAX_HP
Definition: Group.h:114

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetHealth(), GetOwner(), GROUP_UPDATE_FLAG_MAX_HP, GROUP_UPDATE_FLAG_PET_MAX_HP, Object::IsPlayer(), Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetHealth(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXHEALTH.

Referenced by boss_xt002::boss_xt002AI::DoAction(), Spell::EffectSummonType(), boss_halazzi::EnterPhase(), modify_commandscript::HandleModifyHPCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_pet_pri_lightwell::InitializeAI(), Player::InitStatsForLevel(), boss_skeram::JustSummoned(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), Creature::SelectLevel(), boss_akilzon::boss_akilzonAI::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), Creature::UpdateMaxHealth(), Guardian::UpdateMaxHealth(), and Player::UpdateMaxHealth().

◆ SetMaxPower()

void Unit::SetMaxPower ( Powers  power,
uint32  val 
)
15618{
15619 uint32 cur_power = GetPower(power);
15620 SetStatInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power, val);
15621
15622 // group update
15623 if (IsPlayer())
15624 {
15625 Player* player = ToPlayer();
15626 if (getPowerType() == power && player->NeedSendSpectatorData())
15627 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15628
15629 if (player->GetGroup())
15631 }
15632 else if (Pet* pet = ToCreature()->ToPet())
15633 {
15634 if (pet->isControlled())
15635 {
15636 Unit* owner = GetOwner();
15637 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15639 }
15640 }
15641
15642 if (val < cur_power)
15643 SetPower(power, val);
15644}
@ GROUP_UPDATE_FLAG_PET_MAX_POWER
Definition: Group.h:117
@ GROUP_UPDATE_FLAG_MAX_POWER
Definition: Group.h:105
void SetStatInt32Value(uint16 index, int32 value)
Definition: Object.cpp:798

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetOwner(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_MAX_POWER, GROUP_UPDATE_FLAG_PET_MAX_POWER, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetPower(), Object::SetStatInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::Create(), Pet::CreateBaseAtTamed(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), Creature::SelectLevel(), setPowerType(), Creature::UpdateMaxPower(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ SetMinion()

void Unit::SetMinion ( Minion minion,
bool  apply 
)
10672{
10673 LOG_DEBUG("entities.unit", "SetMinion {} for {}, apply {}", minion->GetEntry(), GetEntry(), apply);
10674
10675 if (apply)
10676 {
10677 if (minion->GetOwnerGUID())
10678 {
10679 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10680 return;
10681 }
10682
10683 minion->SetOwnerGUID(GetGUID());
10684
10685 m_Controlled.insert(minion);
10686
10687 if (IsPlayer())
10688 {
10689 minion->m_ControlledByPlayer = true;
10691 }
10692
10693 // Can only have one pet. If a new one is summoned, dismiss the old one.
10694 if (minion->IsGuardianPet())
10695 {
10696 if (Guardian* oldPet = GetGuardianPet())
10697 {
10698 if (oldPet != minion && (oldPet->IsPet() || minion->IsPet() || oldPet->GetEntry() != minion->GetEntry()))
10699 {
10700 // remove existing minion pet
10701 if (Pet* oldPetAsPet = oldPet->ToPet())
10702 {
10703 oldPetAsPet->Remove(PET_SAVE_NOT_IN_SLOT);
10704 }
10705 else
10706 {
10707 oldPet->UnSummon();
10708 }
10709
10710 SetPetGUID(minion->GetGUID());
10712 }
10713 }
10714 else
10715 {
10716 SetPetGUID(minion->GetGUID());
10718 }
10719 }
10720
10722 {
10724 }
10725
10726 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10727 {
10728 SetCritterGUID(minion->GetGUID());
10729 }
10730
10731 // PvP, FFAPvP
10733
10734 // Ghoul pets have energy instead of mana (is anywhere better place for this code?)
10735 if (minion->IsPetGhoul() || minion->GetEntry() == 24207 /*ENTRY_ARMY_OF_THE_DEAD*/)
10736 minion->setPowerType(POWER_ENERGY);
10737
10738 if (IsPlayer())
10739 {
10740 // Send infinity cooldown - client does that automatically but after relog cooldown needs to be set again
10741 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10742
10743 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10744 ToPlayer()->AddSpellAndCategoryCooldowns(spellInfo, 0, nullptr, true);
10745 }
10746 }
10747 else
10748 {
10749 if (minion->GetOwnerGUID() != GetGUID())
10750 {
10751 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10752 return;
10753 }
10754
10755 m_Controlled.erase(minion);
10756
10757 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10758 {
10759 if (GetCritterGUID() == minion->GetGUID())
10761 }
10762
10763 if (minion->IsGuardianPet())
10764 {
10765 if (GetPetGUID() == minion->GetGUID())
10767 }
10768 else if (minion->IsTotem())
10769 {
10770 // All summoned by totem minions must disappear when it is removed.
10771 if (SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(minion->ToTotem()->GetSpell()))
10772 {
10773 for (int i = 0; i < MAX_SPELL_EFFECTS; ++i)
10774 {
10775 if (spInfo->Effects[i].Effect != SPELL_EFFECT_SUMMON)
10776 continue;
10777
10778 RemoveAllMinionsByEntry(spInfo->Effects[i].MiscValue);
10779 }
10780 }
10781 }
10782
10783 if (IsPlayer())
10784 {
10785 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10786 // Remove infinity cooldown
10787 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10788 ToPlayer()->SendCooldownEvent(spellInfo);
10789
10790 // xinef: clear spell book
10791 if (m_Controlled.empty())
10793 }
10794
10795 //if (minion->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10796 {
10798 {
10799 // Check if there is another minion
10800 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10801 {
10802 // do not use this check, creature do not have charm guid
10803 //if (GetCharmGUID() == (*itr)->GetGUID())
10804 if (GetGUID() == (*itr)->GetCharmerGUID())
10805 continue;
10806
10807 //ASSERT((*itr)->GetOwnerGUID() == GetGUID());
10808 if ((*itr)->GetOwnerGUID() != GetGUID())
10809 {
10810 OutDebugInfo();
10811 (*itr)->OutDebugInfo();
10812 ABORT();
10813 }
10814 ASSERT((*itr)->IsCreature());
10815
10816 if (!(*itr)->HasUnitTypeMask(UNIT_MASK_CONTROLABLE_GUARDIAN))
10817 continue;
10818
10819 if (AddGuidValue(UNIT_FIELD_SUMMON, (*itr)->GetGUID()))
10820 {
10821 // show another pet bar if there is no charm bar
10822 if (IsPlayer() && !GetCharmGUID())
10823 {
10824 if ((*itr)->IsPet())
10826 else
10828 }
10829 }
10830 break;
10831 }
10832 }
10833 }
10834 }
10835}
@ PET_SAVE_NOT_IN_SLOT
Definition: PetDefines.h:45
@ SPELL_EFFECT_SUMMON
Definition: SharedDefines.h:806
@ SUMMON_TYPE_MINIPET
Definition: SharedDefines.h:3299
const SummonPropertiesEntry *const m_Properties
Definition: TemporarySummon.h:63
bool IsGuardianPet() const
Definition: TemporarySummon.cpp:390
bool IsPetGhoul() const
Definition: TemporarySummon.h:84
void PetSpellInitialize()
Definition: Player.cpp:9468
uint32 GetSpell(uint8 slot=0) const
Definition: Totem.h:59
void OutDebugInfo() const
Definition: Unit.cpp:20221
ObjectGuid GetCritterGUID() const
Definition: Unit.h:1234
void SetOwnerGUID(ObjectGuid owner)
Definition: Unit.cpp:10564
void SetCritterGUID(ObjectGuid guid)
Definition: Unit.h:1233
void setPowerType(Powers power)
Definition: Unit.cpp:9970
void RemoveAllMinionsByEntry(uint32 entry)
Definition: Unit.cpp:10849
uint32 Type
Definition: DBCStructure.h:1912

References ABORT, Object::AddGuidValue(), Player::AddSpellAndCategoryCooldowns(), ASSERT, Player::CharmSpellInitialize(), ObjectGuid::Empty, Object::GetByteValue(), GetCharmGUID(), GetCritterGUID(), Object::GetEntry(), GetGuardianPet(), Object::GetGUID(), GetOwnerGUID(), GetPetGUID(), Totem::GetSpell(), Object::GetUInt32Value(), HasUnitTypeMask(), SpellInfo::IsCooldownStartedOnEvent(), Minion::IsGuardianPet(), IsPet(), Minion::IsPetGhoul(), Object::IsPlayer(), IsTotem(), LOG_DEBUG, LOG_FATAL, m_Controlled, m_ControlledByPlayer, TempSummon::m_Properties, MAX_SPELL_EFFECTS, OutDebugInfo(), PET_SAVE_NOT_IN_SLOT, Player::PetSpellInitialize(), POWER_ENERGY, RemoveAllMinionsByEntry(), Object::RemoveGuidValue(), Player::SendCooldownEvent(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCritterGUID(), SetMinionGUID(), SetOwnerGUID(), SetPetGUID(), setPowerType(), SetUnitFlag(), SPELL_EFFECT_SUMMON, sSpellMgr, SUMMON_TYPE_MINIPET, ToPet(), Object::ToPlayer(), ToTotem(), SummonPropertiesEntry::Type, UNIT_CREATED_BY_SPELL, UNIT_FIELD_BYTES_2, UNIT_FIELD_SUMMON, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_CONTROLABLE_GUARDIAN.

Referenced by Player::CreatePet(), Spell::EffectCreateTamedPet(), Spell::EffectTameCreature(), Pet::LoadPetFromDB(), Player::RemovePet(), and Player::SummonPet().

◆ SetMinionGUID()

void Unit::SetMinionGUID ( ObjectGuid  guid)
inline

◆ SetModelVisible()

◆ SetModifierValue()

◆ SetNativeDisplayId()

◆ SetNpcFlag()

void Unit::SetNpcFlag ( NPCFlags  flags)
inline
695{ SetFlag(UNIT_NPC_FLAGS, flags); }

References Object::SetFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::InitializeAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::JustReachedHome(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), npc_chesspiece::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), npc_pos_leader_second::npc_pos_leader_secondAI::MovementInform(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::MovementInform(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::MovementInform(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_akama_illidan::PathEndReached(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), Vehicle::RemovePassenger(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_hyjal_jaina::hyjalJainaAI::Reset(), npc_hyjal_thrall::hyjalThrallAI::Reset(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::Reset(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_magister_aledis::Reset(), Vehicle::Reset(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::ResetData(), NPCStaveQuestAI::ResetState(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_harrison_jones::npc_harrison_jonesAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), Vehicle::Vehicle(), npc_arthas::npc_arthasAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_general_andorov::WaypointReached(), and npc_cork_gizelton::npc_cork_gizeltonAI::WaypointReached().

◆ SetOwnerGUID()

void Unit::SetOwnerGUID ( ObjectGuid  owner)
10565{
10566 if (GetOwnerGUID() == owner)
10567 return;
10568
10570 if (!owner)
10571 return;
10572
10573 m_applyResilience = !IsVehicle() && owner.IsPlayer();
10574
10575 // Update owner dependent fields
10576 Player* player = ObjectAccessor::GetPlayer(*this, owner);
10577 if (!player || !player->HaveAtClient(this)) // if player cannot see this unit yet, he will receive needed data with create object
10578 return;
10579
10581
10582 UpdateData udata;
10583 WorldPacket packet;
10584 BuildValuesUpdateBlockForPlayer(&udata, player);
10585 udata.BuildPacket(packet);
10586 player->SendDirectMessage(&packet);
10587
10589}
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition: Object.cpp:257
void RemoveFieldNotifyFlag(uint16 flag)
Definition: Object.h:192
void SetFieldNotifyFlag(uint16 flag)
Definition: Object.h:191
Definition: UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition: UpdateData.cpp:48
bool HaveAtClient(WorldObject const *u) const
Definition: Player.cpp:11411

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), GetOwnerGUID(), ObjectAccessor::GetPlayer(), Player::HaveAtClient(), ObjectGuid::IsPlayer(), IsVehicle(), m_applyResilience, Object::RemoveFieldNotifyFlag(), Player::SendDirectMessage(), Object::SetFieldNotifyFlag(), Object::SetGuidValue(), UF_FLAG_OWNER, and UNIT_FIELD_SUMMONEDBY.

Referenced by GameObject::CastSpell(), Spell::EffectSummonType(), boss_illidari_council_memberAI::EnterEvadeMode(), spell_item_draenic_pale_ale::HandleSummon(), npc_pet_gen_fetch_ball::IsSummonedBy(), boss_razorgore::boss_razorgoreAI::JustSummoned(), Player::LoadFromDB(), SetMinion(), and npc_grimstone::npc_grimstoneAI::UpdateEscortAI().

◆ SetPetGUID()

◆ SetPhaseMask()

void Unit::SetPhaseMask ( uint32  newPhaseMask,
bool  update 
)
overridevirtual

Reimplemented from WorldObject.

19037{
19038 if (newPhaseMask == GetPhaseMask())
19039 return;
19040
19041 if (IsInWorld())
19042 {
19043 // xinef: to comment, bellow line should be removed
19044 // pussywizard: goign to other phase (valithria, algalon) should not remove such auras
19045 //RemoveNotOwnSingleTargetAuras(newPhaseMask, true); // we can lost access to caster or target
19046
19047 if (!sScriptMgr->CanSetPhaseMask(this, newPhaseMask, update))
19048 return;
19049
19050 // modify hostile references for new phasemask, some special cases deal with hostile references themselves
19051 if (IsCreature() || (!ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout()))
19052 {
19053 HostileRefMgr& refMgr = getHostileRefMgr();
19054 HostileReference* ref = refMgr.getFirst();
19055
19056 while (ref)
19057 {
19058 if (Unit* unit = ref->GetSource()->GetOwner())
19059 if (Creature* creature = unit->ToCreature())
19060 refMgr.setOnlineOfflineState(creature, creature->InSamePhase(newPhaseMask));
19061
19062 ref = ref->next();
19063 }
19064
19065 // modify threat lists for new phasemask
19066 if (!IsPlayer())
19067 {
19070
19071 // merge expects sorted lists
19072 threatList.sort();
19073 offlineThreatList.sort();
19074 threatList.merge(offlineThreatList);
19075
19076 for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
19077 if (Unit* unit = (*itr)->getTarget())
19078 unit->getHostileRefMgr().setOnlineOfflineState(ToCreature(), unit->InSamePhase(newPhaseMask));
19079 }
19080 }
19081 }
19082
19083 WorldObject::SetPhaseMask(newPhaseMask, false);
19084
19085 if (!IsInWorld())
19086 {
19087 return;
19088 }
19089
19090 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); )
19091 {
19092 Unit* controlled = *itr;
19093 ++itr;
19094 if (controlled->IsCreature())
19095 {
19096 controlled->SetPhaseMask(newPhaseMask, true);
19097 }
19098 }
19099
19100 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
19101 {
19102 if (m_SummonSlot[i])
19103 {
19104 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
19105 {
19106 summon->SetPhaseMask(newPhaseMask, true);
19107 }
19108 }
19109 }
19110
19111 if (update)
19112 {
19114 }
19115}
FROM * GetSource() const
Definition: Reference.h:97
Definition: HostileRefMgr.h:32
void setOnlineOfflineState(bool isOnline)
Definition: HostileRefMgr.cpp:98
HostileReference * getFirst()
Definition: HostileRefMgr.h:60
HostileReference * next()
Definition: ThreatMgr.h:116
ThreatContainer::StorageType const & GetOfflineThreatList() const
Definition: ThreatMgr.h:275
Unit * GetOwner() const
Definition: ThreatMgr.h:237
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition: Object.cpp:2875
uint32 GetPhaseMask() const
Definition: Object.h:446
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition: Unit.cpp:19036

References HostileRefMgr::getFirst(), getHostileRefMgr(), WorldObject::GetMap(), ThreatMgr::GetOfflineThreatList(), ThreatMgr::GetOwner(), WorldObject::GetPhaseMask(), Reference< TO, FROM >::GetSource(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::InSamePhase(), Object::IsCreature(), Object::IsInWorld(), Object::IsPlayer(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, HostileReference::next(), HostileRefMgr::setOnlineOfflineState(), WorldObject::SetPhaseMask(), SetPhaseMask(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), and UpdateObjectVisibility().

Referenced by Pet::Create(), Creature::Create(), misc_commandscript::HandleAppearCommand(), modify_commandscript::HandleModifyPhaseCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), spell_wintergrasp_hide_small_elementals_aura::HandlePeriodicDummy(), AuraEffect::HandlePhase(), Battlefield::HideNpc(), boss_volazj::InitializeAI(), boss_zuramat::boss_zuramatAI::JustSummoned(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::JustSummoned(), BattlegroundAB::RemovePlayer(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_twilight_halion::boss_twilight_halionAI::Reset(), Creature::setDeathState(), Player::SetGameMaster(), SetPhaseMask(), Battlefield::ShowNpc(), WorldObject::SummonTrigger(), and npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached().

◆ SetPower()

void Unit::SetPower ( Powers  power,
uint32  val,
bool  withPowerUpdate = true,
bool  fromRegenerate = false 
)
15553{
15554 if (!fromRegenerate && GetPower(power) == val)
15555 {
15556 return;
15557 }
15558
15559 uint32 maxPower = GetMaxPower(power);
15560 if (maxPower < val)
15561 {
15562 val = maxPower;
15563 }
15564
15565 if (fromRegenerate)
15566 {
15567 UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, val);
15569 }
15570 else
15571 {
15572 SetStatInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, val);
15573 }
15574
15575 if (withPowerUpdate)
15576 {
15578 data << GetPackGUID();
15579 data << uint8(power);
15580 data << uint32(val);
15581 SendMessageToSet(&data, IsPlayer());
15582 }
15583
15584 // group update
15585 if (IsPlayer())
15586 {
15587 Player* player = ToPlayer();
15588 if (getPowerType() == power && player->NeedSendSpectatorData())
15589 {
15590 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15591 }
15592
15593 if (player->GetGroup())
15594 {
15596 }
15597 }
15598 else if (Pet* pet = ToCreature()->ToPet())
15599 {
15600 if (pet->isControlled())
15601 {
15602 Unit* owner = GetOwner();
15603 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15604 {
15606 }
15607 }
15608
15609 // Update the pet's character sheet with happiness damage bonus
15610 if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS)
15611 {
15612 pet->UpdateDamagePhysical(BASE_ATTACK);
15613 }
15614 }
15615}
@ GROUP_UPDATE_FLAG_PET_CUR_POWER
Definition: Group.h:116
@ GROUP_UPDATE_FLAG_CUR_POWER
Definition: Group.h:104
@ SMSG_POWER_UPDATE
Definition: Opcodes.h:1182
void UpdateUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:663
void AddToObjectUpdateIfNeeded()
Definition: Object.cpp:524

References Object::AddToObjectUpdateIfNeeded(), BASE_ATTACK, WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), Object::GetPackGUID(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_CUR_POWER, GROUP_UPDATE_FLAG_PET_CUR_POWER, HUNTER_PET, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_HAPPINESS, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), WorldObject::SendMessageToSet(), Player::SetGroupUpdateFlag(), Object::SetStatInt32Value(), SMSG_POWER_UPDATE, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_POWER1, and Object::UpdateUInt32Value().

Referenced by Player::ActivateSpec(), Player::Create(), Pet::CreateBaseAtTamed(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), WorldSession::HandlePetAbandon(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), boss_shade_of_aran::OnPowerUpdate(), Player::ProcessDelayedOperations(), Player::Regenerate(), spell_igb_incinerating_blast::RemoveEnergy(), spell_igb_below_zero::RemovePassengers(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_selin_fireheart::Reset(), boss_moam::Reset(), npc_obsidian_destroyer::Reset(), npc_obsidian_eradicator::Reset(), npc_obsidian_nullifier::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::RestoreManaAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetMaxPower(), setPowerType(), Player::SummonPet(), and npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI().

◆ setPowerType()

void Unit::setPowerType ( Powers  power)
9971{
9972 SetByteValue(UNIT_FIELD_BYTES_0, 3, new_powertype);
9973
9974 if (IsPlayer())
9975 {
9976 if (ToPlayer()->GetGroup())
9978 }
9979 else if (Pet* pet = ToCreature()->ToPet())
9980 {
9981 if (pet->isControlled())
9982 {
9983 Unit* owner = GetOwner();
9984 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
9986 }
9987 }
9988
9989 float powerMultiplier = 1.0f;
9990 if (!IsPet())
9991 if (Creature* creature = ToCreature())
9992 powerMultiplier = creature->GetCreatureTemplate()->ModMana;
9993
9994 switch (new_powertype)
9995 {
9996 default:
9997 case POWER_MANA:
9998 break;
9999 case POWER_RAGE:
10000 SetMaxPower(POWER_RAGE, uint32(std::ceil(GetCreatePowers(POWER_RAGE) * powerMultiplier)));
10001 SetPower(POWER_RAGE, 0);
10002 break;
10003 case POWER_FOCUS:
10004 SetMaxPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10005 SetPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10006 break;
10007 case POWER_ENERGY:
10008 SetMaxPower(POWER_ENERGY, uint32(std::ceil(GetCreatePowers(POWER_ENERGY) * powerMultiplier)));
10009 break;
10010 case POWER_HAPPINESS:
10011 SetMaxPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10012 SetPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10013 break;
10014 }
10015
10016 if (Player const* player = ToPlayer())
10017 if (player->NeedSendSpectatorData())
10018 {
10019 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PWT", new_powertype);
10020 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetMaxPower(new_powertype) / 10 : GetMaxPower(new_powertype));
10021 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetPower(new_powertype) / 10 : GetPower(new_powertype));
10022 }
10023}
@ GROUP_UPDATE_FLAG_POWER_TYPE
Definition: Group.h:103
@ GROUP_UPDATE_FLAG_PET_POWER_TYPE
Definition: Group.h:115
void SetMaxPower(Powers power, uint32 val)
Definition: Unit.cpp:15617

References WorldObject::FindMap(), GetCreatePowers(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), GetPower(), GROUP_UPDATE_FLAG_PET_POWER_TYPE, GROUP_UPDATE_FLAG_POWER_TYPE, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Object::SetByteValue(), Player::SetGroupUpdateFlag(), SetMaxPower(), SetPower(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_BYTES_0.

Referenced by Pet::CreateBaseAtTamed(), AuraEffect::HandleAuraModShapeshift(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitDataForForm(), Vehicle::Install(), Pet::LoadPetFromDB(), npc_toc_rogue::npc_toc_rogueAI::npc_toc_rogueAI(), SetMinion(), and Player::SummonPet().

◆ SetPvP()

◆ setRace()

void Unit::setRace ( uint8  race)
21007{
21008 if (IsPlayer())
21009 m_race = race;
21010}

References Object::IsPlayer(), and m_race.

◆ SetRedirectThreat()

void Unit::SetRedirectThreat ( ObjectGuid  guid,
uint32  pct 
)
inline
846{ _redirectThreatInfo.Set(guid, pct); }
void Set(ObjectGuid guid, uint32 pct)
Definition: ThreatMgr.h:302

References _redirectThreatInfo, and RedirectThreatInfo::Set().

Referenced by Spell::EffectRedirectThreat(), and ResetRedirectThreat().

◆ SetResistance()

◆ SetResistanceBuffMods()

void Unit::SetResistanceBuffMods ( SpellSchools  school,
bool  positive,
float  val 
)
inline

◆ SetRooted()

void Unit::SetRooted ( bool  apply,
bool  isStun = false 
)
protected
18192{
18193 if (apply)
18194 {
18195 if (m_rootTimes > 0) // blizzard internal check?
18196 m_rootTimes++;
18197
18198 // MOVEMENTFLAG_ROOT cannot be used in conjunction with MOVEMENTFLAG_MASK_MOVING (tested 3.3.5a)
18199 // this will freeze clients. That's why we remove MOVEMENTFLAG_MASK_MOVING before
18200 // setting MOVEMENTFLAG_ROOT
18202
18203 if (IsFalling())
18204 {
18206 }
18207 else
18208 {
18210 }
18211
18212 // Creature specific
18213 if (!IsPlayer())
18214 {
18215 if (isStun && movespline->Finalized())
18216 {
18218 }
18219 else
18220 {
18221 StopMoving();
18222 }
18223 }
18224
18225 if (m_movedByPlayer)
18226 {
18227 WorldPacket data(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4);
18228 data << GetPackGUID();
18229 data << m_rootTimes;
18231 }
18232 else
18233 {
18235 data << GetPackGUID();
18236 SendMessageToSet(&data, true);
18237 }
18238 }
18239 else
18240 {
18242
18243 if (!HasUnitState(UNIT_STATE_STUNNED)) // prevent moving if it also has stun effect
18244 {
18245 if (m_movedByPlayer)
18246 {
18248 data << GetPackGUID();
18249 data << m_rootTimes;
18251 }
18252 else
18253 {
18255 data << GetPackGUID();
18256 SendMessageToSet(&data, true);
18257 }
18258 }
18259 }
18260}
@ MOVEMENTFLAG_PENDING_ROOT
Definition: UnitDefines.h:364
@ SMSG_FORCE_MOVE_UNROOT
Definition: Opcodes.h:264
@ SMSG_FORCE_MOVE_ROOT
Definition: Opcodes.h:262
@ SMSG_SPLINE_MOVE_ROOT
Definition: Opcodes.h:824
void StopMovingOnCurrentPos()
Definition: Unit.cpp:16676

References AddUnitMovementFlag(), Movement::MoveSpline::Finalized(), Object::GetPackGUID(), HasUnitState(), IsFalling(), Object::IsPlayer(), m_movedByPlayer, m_rootTimes, MOVEMENTFLAG_MASK_MOVING, MOVEMENTFLAG_PENDING_ROOT, MOVEMENTFLAG_ROOT, movespline, RemoveUnitMovementFlag(), Player::SendDirectMessage(), WorldObject::SendMessageToSet(), SMSG_FORCE_MOVE_ROOT, SMSG_FORCE_MOVE_UNROOT, SMSG_SPLINE_MOVE_ROOT, SMSG_SPLINE_MOVE_UNROOT, StopMoving(), StopMovingOnCurrentPos(), Object::ToPlayer(), and UNIT_STATE_STUNNED.

Referenced by WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), SetControlled(), and SetStunned().

◆ SetShapeshiftForm()

void Unit::SetShapeshiftForm ( ShapeshiftForm  form)
inline

◆ SetSheath()

◆ SetSpeed()

void Unit::SetSpeed ( UnitMoveType  mtype,
float  rate,
bool  forced = false 
)
14416{
14417 if (rate < 0)
14418 rate = 0.0f;
14419
14420 // Update speed only on change
14421 if (m_speed_rate[mtype] == rate)
14422 return;
14423
14424 m_speed_rate[mtype] = rate;
14425
14427
14428 WorldPacket data;
14429 if (!forced)
14430 {
14431 switch (mtype)
14432 {
14433 case MOVE_WALK:
14434 data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14435 break;
14436 case MOVE_RUN:
14437 data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14438 break;
14439 case MOVE_RUN_BACK:
14440 data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14441 break;
14442 case MOVE_SWIM:
14443 data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14444 break;
14445 case MOVE_SWIM_BACK:
14446 data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14447 break;
14448 case MOVE_TURN_RATE:
14449 data.Initialize(MSG_MOVE_SET_TURN_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14450 break;
14451 case MOVE_FLIGHT:
14452 data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14453 break;
14454 case MOVE_FLIGHT_BACK:
14455 data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14456 break;
14457 case MOVE_PITCH_RATE:
14458 data.Initialize(MSG_MOVE_SET_PITCH_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14459 break;
14460 default:
14461 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14462 return;
14463 }
14464
14465 data << GetPackGUID();
14466 BuildMovementPacket(&data);
14467 data << float(GetSpeed(mtype));
14468 SendMessageToSet(&data, true);
14469 }
14470 else
14471 {
14472 if (IsPlayer())
14473 {
14474 // register forced speed changes for WorldSession::HandleForceSpeedChangeAck
14475 // and do it only for real sent packets and use run for run/mounted as client expected
14476 ++ToPlayer()->m_forced_speed_changes[mtype];
14477
14478 // Xinef: update speed of pet also
14479 if (!IsInCombat())
14480 {
14481 Unit* pet = ToPlayer()->GetPet();
14482 if (!pet)
14483 pet = GetCharm();
14484
14485 // xinef: do not affect vehicles and possesed pets
14486 if (pet && (pet->HasUnitFlag(UNIT_FLAG_POSSESSED) || pet->IsVehicle()))
14487 pet = nullptr;
14488
14489 if (pet && pet->IsCreature() && !pet->IsInCombat() && pet->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE)
14490 pet->UpdateSpeed(mtype, forced);
14491 if (Unit* critter = ObjectAccessor::GetUnit(*this, GetCritterGUID()))
14492 critter->UpdateSpeed(mtype, forced);
14493 }
14494 ToPlayer()->SetCanTeleport(true);
14495 }
14496
14497 switch (mtype)
14498 {
14499 case MOVE_WALK:
14501 break;
14502 case MOVE_RUN:
14504 break;
14505 case MOVE_RUN_BACK:
14507 break;
14508 case MOVE_SWIM:
14510 break;
14511 case MOVE_SWIM_BACK:
14513 break;
14514 case MOVE_TURN_RATE:
14516 break;
14517 case MOVE_FLIGHT:
14519 break;
14520 case MOVE_FLIGHT_BACK:
14522 break;
14523 case MOVE_PITCH_RATE:
14525 break;
14526 default:
14527 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14528 return;
14529 }
14530 data << GetPackGUID();
14531 data << (uint32)0; // moveEvent, NUM_PMOVE_EVTS = 0x39
14532 if (mtype == MOVE_RUN)
14533 data << uint8(0); // new 2.1.0
14534 data << float(GetSpeed(mtype));
14535 SendMessageToSet(&data, true);
14536 }
14537}
@ MOVE_TURN_RATE
Definition: UnitDefines.h:333
@ MOVE_FLIGHT_BACK
Definition: UnitDefines.h:335
@ MOVE_SWIM_BACK
Definition: UnitDefines.h:332
@ MOVE_PITCH_RATE
Definition: UnitDefines.h:336
@ MOVE_RUN_BACK
Definition: UnitDefines.h:330
@ MOVE_WALK
Definition: UnitDefines.h:328
@ FOLLOW_MOTION_TYPE
Definition: MotionMaster.h:52
@ SMSG_FORCE_TURN_RATE_CHANGE
Definition: Opcodes.h:764
@ MSG_MOVE_SET_SWIM_BACK_SPEED
Definition: Opcodes.h:243
@ MSG_MOVE_SET_TURN_RATE
Definition: Opcodes.h:246
@ SMSG_FORCE_WALK_SPEED_CHANGE
Definition: Opcodes.h:760
@ SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE
Definition: Opcodes.h:929
@ MSG_MOVE_SET_PITCH_RATE
Definition: Opcodes.h:1145
@ SMSG_FORCE_RUN_SPEED_CHANGE
Definition: Opcodes.h:256
@ SMSG_FORCE_SWIM_BACK_SPEED_CHANGE
Definition: Opcodes.h:762
@ SMSG_FORCE_RUN_BACK_SPEED_CHANGE
Definition: Opcodes.h:258
@ SMSG_FORCE_FLIGHT_SPEED_CHANGE
Definition: Opcodes.h:927
@ SMSG_FORCE_SWIM_SPEED_CHANGE
Definition: Opcodes.h:260
@ MSG_MOVE_SET_RUN_SPEED
Definition: Opcodes.h:235
@ MSG_MOVE_SET_FLIGHT_SPEED
Definition: Opcodes.h:924
@ MSG_MOVE_SET_WALK_SPEED
Definition: Opcodes.h:239
@ MSG_MOVE_SET_SWIM_SPEED
Definition: Opcodes.h:241
@ MSG_MOVE_SET_FLIGHT_BACK_SPEED
Definition: Opcodes.h:926
@ SMSG_FORCE_PITCH_RATE_CHANGE
Definition: Opcodes.h:1146
@ MSG_MOVE_SET_RUN_BACK_SPEED
Definition: Opcodes.h:237
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition: Player.h:2382
float GetSpeed(UnitMoveType mtype) const
Definition: Unit.cpp:14410
void propagateSpeedChange()
-------—End of Pet responses methods-------—
Definition: Unit.h:1662
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition: MotionMaster.cpp:913

References BuildMovementPacket(), FOLLOW_MOTION_TYPE, GetCharm(), GetCritterGUID(), MotionMaster::GetCurrentMovementGeneratorType(), GetMotionMaster(), Object::GetPackGUID(), Player::GetPet(), GetSpeed(), ObjectAccessor::GetUnit(), HasUnitFlag(), WorldPacket::Initialize(), Object::IsCreature(), IsInCombat(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, Player::m_forced_speed_changes, m_speed_rate, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_PITCH_RATE, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_TURN_RATE, MOVE_WALK, MSG_MOVE_SET_FLIGHT_BACK_SPEED, MSG_MOVE_SET_FLIGHT_SPEED, MSG_MOVE_SET_PITCH_RATE, MSG_MOVE_SET_RUN_BACK_SPEED, MSG_MOVE_SET_RUN_SPEED, MSG_MOVE_SET_SWIM_BACK_SPEED, MSG_MOVE_SET_SWIM_SPEED, MSG_MOVE_SET_TURN_RATE, MSG_MOVE_SET_WALK_SPEED, propagateSpeedChange(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, SMSG_FORCE_FLIGHT_SPEED_CHANGE, SMSG_FORCE_PITCH_RATE_CHANGE, SMSG_FORCE_RUN_BACK_SPEED_CHANGE, SMSG_FORCE_RUN_SPEED_CHANGE, SMSG_FORCE_SWIM_BACK_SPEED_CHANGE, SMSG_FORCE_SWIM_SPEED_CHANGE, SMSG_FORCE_TURN_RATE_CHANGE, SMSG_FORCE_WALK_SPEED_CHANGE, Object::ToPlayer(), UNIT_FLAG_POSSESSED, and UpdateSpeed().

Referenced by Battleground::AddCreature(), boss_bug_trio::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), boss_zuljin::boss_zuljinAI::EnterPhase(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), boss_volkhan::boss_volkhanAI::GoToAnvil(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), WorldSession::HandleForceSpeedChangeAck(), modify_commandscript::HandleModifyASpeedCommand(), modify_commandscript::HandleModifyMountCommand(), Creature::InitEntry(), boss_glob_of_viscidus::InitializeAI(), Guardian::InitStatsForLevel(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), boss_sartharion_dragonAI::JustEngagedWith(), boss_four_horsemen::boss_four_horsemenAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), boss_onyxia::MovementInform(), boss_bug_trio::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_akilzon_eagle::npc_akilzon_eagleAI::MovementInform(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_batrider::npc_batrider(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), boss_nightbane::PathEndReached(), npc_eastvale_peasent::PathEndReached(), SmartScript::ProcessAction(), boss_nightbane::Reset(), boss_kalec::boss_kalecAI::Reset(), boss_headless_horseman::Reset(), boss_onyxia::Reset(), boss_bug_trio::Reset(), boss_sartharion_dragonAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_volkhan::boss_volkhanAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), npc_freed_protodrake::npc_freed_protodrakeAI::Reset(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), npc_eastvale_peasent::SetData(), Battlefield::SpawnCreature(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), npc_akilzon_eagle::npc_akilzon_eagleAI::UpdateAI(), boss_zuljin::boss_zuljinAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), UpdateSpeed(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetSpeedRate()

◆ SetStandFlags()

◆ SetStandState()

void Unit::SetStandState ( uint8  state)
16714{
16716
16717 if (IsStandState())
16719
16720 if (IsPlayer())
16721 {
16723 data << (uint8)state;
16724 ToPlayer()->GetSession()->SendPacket(&data);
16725 }
16726}
@ UNIT_BYTES_1_OFFSET_STAND_STATE
Definition: UnitDefines.h:23
@ SMSG_STANDSTATE_UPDATE
Definition: Opcodes.h:699

References AURA_INTERRUPT_FLAG_NOT_SEATED, Player::GetSession(), Object::IsPlayer(), IsStandState(), RemoveAurasWithInterruptFlags(), WorldSession::SendPacket(), Object::SetByteValue(), SMSG_STANDSTATE_UPDATE, Object::ToPlayer(), UNIT_BYTES_1_OFFSET_STAND_STATE, and UNIT_FIELD_BYTES_1.

Referenced by _ApplyAura(), npc_mograine::npc_mograineAI::AshbringerEvent(), boss_felmyst::boss_felmystAI::boss_felmystAI(), boss_kologarn::boss_kologarnAI::boss_kologarnAI(), boss_twinemperorsAI::boss_twinemperorsAI(), boss_thekal::CheckPhaseTransition(), npc_ringo::npc_ringoAI::ClearFaint(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), CombatStart(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), boss_thekal::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_nightbane::DoAction(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_the_lurker_below::DoAction(), boss_leotheras_the_blind::DoAction(), npc_madrigosa::npc_madrigosaAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), Spell::DoAllEffectOnTarget(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_ahune::Emerge(), UtherBatteredHiltEvent::Execute(), SuckBackEvent::Execute(), boss_ahune::ExecuteEvent(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::FeignDeath(), WorldSession::HandleAlterAppearance(), WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandlePlayerLoginFromDB(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStandStateChangeOpcode(), spell_q11322_q11317_the_cleansing::if(), DistractMovementGenerator::Initialize(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), boss_kalecgos::boss_kalecgosAI::JustEngagedWith(), boss_palehoof::boss_palehoofAI::JustReachedHome(), npc_massive_jormungar::npc_massive_jormungarAI::JustReachedHome(), npc_ferocious_rhino::npc_ferocious_rhinoAI::JustReachedHome(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::JustReachedHome(), npc_frenzied_worgen::npc_frenzied_worgenAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), npc_mograine::npc_mograineAI::MoveInLineOfSight(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_kologarn::boss_kologarnAI::MoveInLineOfSight(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::MoveInLineOfSight(), npc_twilight_volunteer::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), npc_madrigosa::npc_madrigosaAI::npc_madrigosaAI(), spell_love_is_in_the_air_romantic_picnic::OnApply(), boss_shade_of_aran::OnPowerUpdate(), npc_kernobee::OnQuestAccept(), npc_koltira_deathweaver::OnQuestAccept(), npc_kerlonian::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_ringo::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_bonker_togglevolt::OnQuestAccept(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), Spell::prepare(), PretendToDie(), boss_alar::PretendToDie(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_kalecgos::boss_kalecgosAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_thekal::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Reset(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::Reset(), boss_illidan_stormrage::Reset(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), Resurrect(), boss_the_lurker_below::SchedulerPhaseOne(), boss_the_lurker_below::SchedulerPhaseTwo(), npc_ringo::npc_ringoAI::SetFaint(), npc_kurenai_captive::npc_kurenai_captiveAI::SetGUID(), SetInCombatState(), npc_kerlonian::npc_kerlonianAI::SetSleeping(), SetStunned(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), boss_ahune::Submerge(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_corporal_keeshan::npc_corporal_keeshanAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::npc_forest_frogAI::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), GameObject::Use(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetStat()

void Unit::SetStat ( Stats  stat,
int32  val 
)
inline

◆ SetStunned()

void Unit::SetStunned ( bool  apply)
protected
18144{
18146 {
18147 return;
18148 }
18149
18150 if (apply)
18151 {
18152 SetTarget();
18154
18155 if (IsPlayer())
18156 {
18158 }
18159
18160 SetRooted(true, true);
18161
18162 CastStop();
18163 }
18164 else
18165 {
18166 if (IsAlive() && GetVictim())
18168
18169 if (IsCreature())
18170 {
18171 // don't remove UNIT_FLAG_STUNNED for pet when owner is mounted (disabled pet's interface)
18172 Unit* owner = GetOwner();
18173 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18175
18176 // Xinef: same for charmed npcs
18177 owner = GetCharmer();
18178 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18180 }
18181 else
18183
18184 if (!HasUnitState(UNIT_STATE_ROOT)) // prevent moving if it also has root effect
18185 {
18186 SetRooted(false, true);
18187 }
18188 }
18189}

References CastStop(), GetCharmer(), Object::GetGUID(), GetOwner(), GetVictim(), HasUnitState(), IsAlive(), Object::IsCreature(), IsMounted(), Object::IsPlayer(), RemoveUnitFlag(), SetRooted(), SetStandState(), SetTarget(), SetUnitFlag(), Object::ToPlayer(), UNIT_FLAG_STUNNED, UNIT_STAND_STATE_STAND, UNIT_STATE_IN_FLIGHT, and UNIT_STATE_ROOT.

Referenced by SetControlled().

◆ SetSwim()

bool Unit::SetSwim ( bool  enable)
virtual

◆ SetTarget()

virtual void Unit::SetTarget ( ObjectGuid  = ObjectGuid::Empty)
pure virtual

◆ setTransForm()

void Unit::setTransForm ( uint32  spellid)
inline
1526{ m_transform = spellid;}

References m_transform.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetUInt32Value()

void Unit::SetUInt32Value ( uint16  index,
uint32  value 
)
21304{
21305 Object::SetUInt32Value(index, value);
21306
21307 switch (index)
21308 {
21309 // Invalidating the cache on health change should fix an issue where the client sees dead NPCs when they are not.
21310 // We might also need to invalidate the cache for some other fields as well.
21311 case UNIT_FIELD_HEALTH:
21313 break;
21314 }
21315}
void SetUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:650
void InvalidateValuesUpdateCache()
Definition: Unit.h:1944

References InvalidateValuesUpdateCache(), Object::SetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_LoadDailyQuestStatus(), Player::_LoadSkills(), Player::AddItemToBuyBackSlot(), Attack(), Player::CheckAreaExploreAndOutdoor(), Spell::CheckItems(), Player::Create(), Pet::CreateBaseAtTamed(), Player::CreatePet(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), Dismount(), boss_thekal::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), boss_pathaleon_the_calculator::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_illidan_stormrage::DoAction(), Player::DuelComplete(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), boss_jindo::EnterEvadeMode(), boss_zuljin::boss_zuljinAI::EnterPhase(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraTransform(), character_commandscript::HandleCharacterLevel(), debug_commandscript::HandleDebugMod32ValueCommand(), debug_commandscript::HandleDebugUpdateCommand(), spell_dk_dancing_rune_weapon_visual::HandleEffectApply(), spell_gen_model_visible::HandleEffectApply(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_baby_murloc::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), misc_commandscript::HandleHideAreaCommand(), modify_commandscript::HandleModifyStandStateCommand(), modify_commandscript::HandleMorphMountCommand(), WorldSession::HandleMovementOpcodes(), AuraEffect::HandleNoReagentUseAura(), npc_commandscript::HandleNpcPlayEmoteCommand(), WorldSession::HandlePetRename(), reset_commandscript::HandleResetHonorCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), WorldSession::HandleSelfResOpcode(), WorldSession::HandleSetTitleOpcode(), WorldSession::HandleSetWatchedFactionOpcode(), misc_commandscript::HandleShowAreaCommand(), WorldSession::HandleTextEmoteOpcode(), titles_commandscript::HandleTitlesCurrentCommand(), titles_commandscript::HandleTitlesRemoveCommand(), titles_commandscript::HandleTitlesSetMaskCommand(), Player::InitGlyphsForLevel(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Initialize(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), InitTamedPet(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustDied(), boss_xt002::boss_xt002AI::JustEngagedWith(), npc_dragonflayer_forge_master::npc_dragonflayer_forge_masterAI::JustEngagedWith(), boss_jindo::JustEngagedWith(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Kill(), Creature::LoadCreaturesAddon(), Creature::LoadEquipment(), Player::LoadFromDB(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), Player::ModifySkillBonus(), Mount(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), npc_tirion_fordring_tft::npc_tirion_fordringAI::MovementInform(), npc_akama_illidan::MovementInform(), npc_thassarian2::npc_thassarian2AI::MovementInform(), npc_apothecary_genericAI::MovementInform(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::npc_pos_martin_or_gorkun_secondAI(), spell_gen_clone_weapon_aura::OnApply(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_ame::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), spell_gen_clone_weapon_aura::OnRemove(), npc_eastvale_peasent::PathEndReached(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), Player::RemoveAmmo(), Player::RemoveItemFromBuyBackSlot(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), ReplaceAllDynamicFlags(), ReplaceAllNpcFlags(), Player::ReplaceAllPlayerFlags(), ReplaceAllUnitFlags(), ReplaceAllUnitFlags2(), boss_ragnaros::boss_ragnarosAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_zuljin::boss_zuljinAI::Reset(), boss_arlokk::boss_arlokkAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), npc_hor_leader::npc_hor_leaderAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetDailyQuestStatus(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), Spell::SendChannelStart(), Spell::SendChannelUpdate(), Player::SetAmmo(), Player::SetArenaPoints(), Player::SetArenaTeamInfoField(), SetCharmedBy(), SetCreateHealth(), SetCreateMana(), Player::SetCurrentTitle(), Player::SetDailyQuestStatus(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), npc_eastvale_peasent::SetData(), setDeathState(), Player::setDeathState(), SetDisplayId(), SetFaction(), Player::SetFreePrimaryProfessions(), Player::SetFreeTalentPoints(), Player::SetGlyph(), Player::SetGlyphSlot(), SetHealth(), Player::SetHonorPoints(), Player::SetInGuild(), SetLevel(), SetMaxHealth(), Player::SetMoney(), SetNativeDisplayId(), CharmInfo::SetPetNumber(), Player::SetQuestSlot(), Player::SetQuestSlotTimer(), Player::SetRank(), Player::SetRestBonus(), Player::SetSkill(), SetVirtualItem(), Player::SetVisibleItemSlot(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Map::SummonCreature(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), Player::SummonPet(), Player::SwapQuestSlot(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_harrison_jones::npc_harrison_jonesAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), Player::UpdateArmorPenetration(), Player::UpdateDuelFlag(), Player::UpdateExpertise(), Player::UpdateHonorFields(), Player::UpdateRating(), Player::UpdateShieldBlockValue(), Player::UpdateSkill(), Player::UpdateSkillPro(), Player::UpdateSkillsForLevel(), Player::UpdateSkillsToMaxSkillsForLevel(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), and npc_ranger_lilatha::WaypointReached().

◆ SetUnitFlag()

void Unit::SetUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

683{ SetFlag(UNIT_FIELD_FLAGS, flags); }

References Object::SetFlag(), and UNIT_FIELD_FLAGS.

Referenced by BattlegroundAV::AddAVCreature(), Vehicle::AddPassenger(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::AddPortals(), Creature::AllLootRemovedFromCorpse(), npc_doctor::npc_doctorAI::BeginEvent(), boss_jarien::boss_jarien(), boss_sothos::boss_sothos(), GameObject::CastSpell(), Player::Create(), boss_felblood_kaelthas::DamageTaken(), npc_mograine::npc_mograineAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_kiljaeden::boss_kiljaedenAI::DamageTaken(), boss_muru::boss_muruAI::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Deactivate(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), boss_felmyst::boss_felmystAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_illidan_stormrage::DoAction(), PetAI::DoAttack(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_erekem::boss_erekemAI::EnterEvadeMode(), boss_ichoron::boss_ichoronAI::EnterEvadeMode(), boss_lavanthor::boss_lavanthorAI::EnterEvadeMode(), boss_moragg::boss_moraggAI::EnterEvadeMode(), boss_xevozz::boss_xevozzAI::EnterEvadeMode(), boss_zuramat::boss_zuramatAI::EnterEvadeMode(), boss_anubarak_trial::boss_anubarak_trialAI::EnterEvadeMode(), boss_jaraxxus::boss_jaraxxusAI::EnterEvadeMode(), boss_gormok::boss_gormokAI::EnterEvadeMode(), boss_jormungarAI::EnterEvadeMode(), boss_icehowl::boss_icehowlAI::EnterEvadeMode(), boss_zuljin::boss_zuljinAI::EnterPhase(), SACDeactivateEvent::Execute(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::FeignDeath(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_gen_model_visible::HandleEffectApply(), spell_gen_feign_death_all_flags::HandleEffectApply(), spell_gen_feign_death_no_dyn_flag::HandleEffectApply(), spell_gen_feign_death_no_prevent_emotes::HandleEffectApply(), AuraEffect::HandleFeignDeath(), BattlefieldWG::HandleKill(), Battleground::HandleKillPlayer(), WorldSession::HandleLogoutRequestOpcode(), spell_oculus_rider_aura::HandleOnEffectApply(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_malchezaar_axe::Initialize(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::Initialize(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::InitializeAI(), boss_kiljaeden::boss_kiljaedenAI::InitializeAI(), npc_general_andorov::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), Player::InitStatsForLevel(), boss_kologarn::boss_kologarnAI::JustDied(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_felmyst::boss_felmystAI::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_gothik::boss_gothikAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_hazzarah::JustSummoned(), boss_vaelastrasz::boss_vaelAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Mount(), npc_shattered_hand_scout::MoveInLineOfSight(), npc_batrider::npc_batrider(), npc_blade_of_azzinoth::npc_blade_of_azzinoth(), npc_chess_move_trigger::npc_chess_move_trigger(), npc_hol_monument::npc_hol_monumentAI::npc_hol_monumentAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_q24545_vegard::npc_q24545_vegardAI::npc_q24545_vegardAI(), npc_xt002_heart::npc_xt002_heartAI::npc_xt002_heartAI(), spell_halion_twilight_phasing_aura::OnApply(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), Creature::RefreshSwimmingFlag(), boss_keristrasza::boss_keristraszaAI::RemovePrison(), npc_grimstone::npc_grimstoneAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_nefarian::Reset(), boss_nightbane::Reset(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), npc_hallows_end_soh::Reset(), npc_ancient_wisp::Reset(), boss_cthun::Reset(), npc_depth_charge::npc_depth_chargeAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_death_ravager::npc_death_ravagerAI::Reset(), npc_giant_spotlight::npc_giant_spotlightAI::Reset(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_announcer_toc5::npc_announcer_toc5AI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_tyrannus::boss_tyrannusAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_malygos::boss_malygosAI::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_massive_jormungar::npc_massive_jormungarAI::Reset(), npc_ferocious_rhino::npc_ferocious_rhinoAI::Reset(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::Reset(), npc_frenzied_worgen::npc_frenzied_worgenAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), npc_drakuru_shackles::npc_drakuru_shacklesAI::Reset(), boss_shade_of_akama::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), boss_warlord_kalithresh::Reset(), boss_broggok::Reset(), boss_kelidan_the_breaker::Reset(), boss_magtheridon::Reset(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_the_lurker_below::SchedulerPhaseOne(), Player::SendLoot(), SetCharm(), SetCharmedBy(), SetImmuneToNPC(), SetImmuneToPC(), SetInCombatState(), Player::SetIsSpectator(), SetMinion(), SetStunned(), SetSwim(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::ShowNpc(), boss_zuljin::boss_zuljinAI::SpawnAdds(), npc_netherspite_infernal::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_ionar::boss_ionarAI::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), npc_giant_claw_tentacle::Submerge(), boss_ouro::Submerge(), boss_ahune::Submerge(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_blistering_zombie::npc_blistering_zombieAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and Creature::UpdateEntry().

◆ SetUnitFlag2()

◆ SetUnitMovementFlags()

◆ SetVirtualItem()

void Unit::SetVirtualItem ( uint32  slot,
uint32  itemId 
)
21163{
21164 if (slot >= MAX_EQUIPMENT_ITEMS)
21165 return;
21166
21168}

References MAX_EQUIPMENT_ITEMS, SetUInt32Value(), and UNIT_VIRTUAL_ITEM_SLOT_ID.

Referenced by ScriptedAI::SetEquipmentSlots().

◆ SetVisible()

void Unit::SetVisible ( bool  x)
14219{
14220 if (!x)
14222 else
14224
14226}
@ SEC_GAMEMASTER
Definition: Common.h:59

References WorldObject::m_serverSideVisibility, SEC_GAMEMASTER, SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and UpdateObjectVisibility().

Referenced by boss_felmyst::boss_felmystAI::boss_felmystAI(), Creature::Create(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), boss_archimonde::DoAction(), boss_felmyst::boss_felmystAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), HideNpcEvent::Execute(), UtherBatteredHiltEvent::Execute(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::FinishQuest(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), BattlegroundSA::HandleKillUnit(), Battlefield::HideNpc(), boss_kiljaeden::boss_kiljaedenAI::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), npc_xt002_heart::npc_xt002_heartAI::JustDied(), boss_kalecgos::boss_kalecgosAI::JustReachedHome(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::JustReachedHome(), SmartAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_hazzarah::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::MovementInform(), boss_vazruden_the_herald::MovementInform(), npc_shattered_hand_scout::MovementInform(), npc_madrigosa::npc_madrigosaAI::npc_madrigosaAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::npc_time_lost_proto_drakeAI(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnCreatureCreate(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::OnCreatureCreate(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_pit_of_saron::instance_pit_of_saron_InstanceScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::PassengerBoarded(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_midnight::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_muru::boss_muruAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_archimonde::Reset(), boss_eye_of_cthun::Reset(), npc_murkdeep::npc_murkdeepAI::Reset(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_pos_leader::npc_pos_leaderAI::Reset(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::Reset(), boss_ionar::boss_ionarAI::Reset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::Reset(), npc_minigob_manabonk::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), boss_vazruden_the_herald::Reset(), npc_enslaved_netherwing_drake::Reset(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SetData(), Battlefield::ShowNpc(), boss_ionar::boss_ionarAI::Split(), boss_warchief_kargath_bladefist::SummonedCreatureDies(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), boss_muru::boss_muruAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), npc_commander_dawnforge::npc_commander_dawnforgeAI::UpdateAI(), SmartAI::UpdateDespawn(), npc_grimstone::npc_grimstoneAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_taretha::npc_tarethaAI::WaypointReached().

◆ SetVisibleAura()

void Unit::SetVisibleAura ( uint8  slot,
AuraApplication aur 
)
inline

◆ SetWalk()

bool Unit::SetWalk ( bool  enable)
virtual

Reimplemented in Creature.

20538{
20539 if (enable == IsWalking())
20540 return false;
20541
20542 if (enable)
20544 else
20546
20548 return true;
20549}
bool IsWalking() const
Definition: Unit.h:1709

References AddUnitMovementFlag(), IsWalking(), MOVEMENTFLAG_WALKING, propagateSpeedChange(), and RemoveUnitMovementFlag().

Referenced by debug_commandscript::HandleDebugMoveflagsCommand(), SetCharm(), and Creature::SetWalk().

◆ SetWaterWalking()

bool Unit::SetWaterWalking ( bool  enable,
bool  packetOnly = false 
)
virtual

Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players.

Reimplemented in Player, and Creature.

20617{
20619 return false;
20620
20621 if (enable)
20623 else
20625
20626 return true;
20627}
@ MOVEMENTFLAG_WATERWALKING
Definition: UnitDefines.h:372

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_WATERWALKING, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraWaterWalk(), debug_commandscript::HandleDebugMoveflagsCommand(), Player::SetWaterWalking(), and Creature::SetWaterWalking().

◆ SpellBaseDamageBonusDone()

int32 Unit::SpellBaseDamageBonusDone ( SpellSchoolMask  schoolMask)
11924{
11925 int32 DoneAdvertisedBenefit = 0;
11926
11928 for (AuraEffectList::const_iterator i = mDamageDone.begin(); i != mDamageDone.end(); ++i)
11929 if (((*i)->GetMiscValue() & schoolMask) != 0 &&
11930 (*i)->GetSpellInfo()->EquippedItemClass == -1 &&
11931 // -1 == any item class (not wand then)
11932 (*i)->GetSpellInfo()->EquippedItemInventoryTypeMask == 0)
11933 // 0 == any inventory type (not wand then)
11934 DoneAdvertisedBenefit += (*i)->GetAmount();
11935
11936 if (IsPlayer())
11937 {
11938 // Base value
11939 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
11940
11941 // Damage bonus from stats
11943 for (AuraEffectList::const_iterator i = mDamageDoneOfStatPercent.begin(); i != mDamageDoneOfStatPercent.end(); ++i)
11944 {
11945 if ((*i)->GetMiscValue() & schoolMask)
11946 {
11947 // stat used stored in miscValueB for this aura
11948 Stats usedStat = Stats((*i)->GetMiscValueB());
11949 DoneAdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
11950 }
11951 }
11952 // ... and attack power
11954 for (AuraEffectList::const_iterator i = mDamageDonebyAP.begin(); i != mDamageDonebyAP.end(); ++i)
11955 if ((*i)->GetMiscValue() & schoolMask)
11956 DoneAdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
11957 }
11958 return DoneAdvertisedBenefit;
11959}
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER
Definition: SpellAuraDefines.h:300
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:237
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition: SpellAuraDefines.h:76
uint32 GetBaseSpellPowerBonus()
Definition: Player.h:1953

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::IsPlayer(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by spell_item_wraith_scythe_drain_life::CalculateDamage(), spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), Spell::EffectWeaponDmg(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), SpellDamageBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseDamageBonusTaken()

int32 Unit::SpellBaseDamageBonusTaken ( SpellSchoolMask  schoolMask,
bool  isDoT = false 
)
11962{
11963 int32 TakenAdvertisedBenefit = 0;
11964
11966 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
11967 if (((*i)->GetMiscValue() & schoolMask) != 0)
11968 {
11969 // Xinef: if we have DoT damage type and aura has charges, check if it affects DoTs
11970 // Xinef: required for hemorrhage & rupture / garrote
11971 if (isDoT && (*i)->GetBase()->IsUsingCharges() && !((*i)->GetSpellInfo()->ProcFlags & PROC_FLAG_TAKEN_PERIODIC))
11972 continue;
11973
11974 TakenAdvertisedBenefit += (*i)->GetAmount();
11975 }
11976
11977 return TakenAdvertisedBenefit;
11978}

References GetAuraEffectsByType(), PROC_FLAG_TAKEN_PERIODIC, and SPELL_AURA_MOD_DAMAGE_TAKEN.

Referenced by HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), and SpellDamageBonusTaken().

◆ SpellBaseHealingBonusDone()

int32 Unit::SpellBaseHealingBonusDone ( SpellSchoolMask  schoolMask)
12689{
12690 int32 AdvertisedBenefit = 0;
12691
12693 for (AuraEffectList::const_iterator i = mHealingDone.begin(); i != mHealingDone.end(); ++i)
12694 if (!(*i)->GetMiscValue() || ((*i)->GetMiscValue() & schoolMask) != 0)
12695 AdvertisedBenefit += (*i)->GetAmount();
12696
12697 // Healing bonus of spirit, intellect and strength
12698 if (IsPlayer())
12699 {
12700 // Base value
12701 AdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12702
12703 // Healing bonus from stats
12705 for (AuraEffectList::const_iterator i = mHealingDoneOfStatPercent.begin(); i != mHealingDoneOfStatPercent.end(); ++i)
12706 {
12707 // stat used dependent from misc value (stat index)
12708 Stats usedStat = Stats((*i)->GetSpellInfo()->Effects[(*i)->GetEffIndex()].MiscValue);
12709 AdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12710 }
12711
12712 // ... and attack power
12714 for (AuraEffectList::const_iterator i = mHealingDonebyAP.begin(); i != mHealingDonebyAP.end(); ++i)
12715 if ((*i)->GetMiscValue() & schoolMask)
12716 AdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
12717 }
12718 return AdvertisedBenefit;
12719}
@ SPELL_AURA_MOD_HEALING_DONE
Definition: SpellAuraDefines.h:198
@ SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:238
@ SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER
Definition: SpellAuraDefines.h:301

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::IsPlayer(), SPELL_AURA_MOD_HEALING_DONE, SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by CalculateSpellAmount(), SpellHealingBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseHealingBonusTaken()

int32 Unit::SpellBaseHealingBonusTaken ( SpellSchoolMask  schoolMask)
12722{
12723 int32 AdvertisedBenefit = 0;
12724
12726 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
12727 if (((*i)->GetMiscValue() & schoolMask) != 0)
12728 AdvertisedBenefit += (*i)->GetAmount();
12729
12730 return AdvertisedBenefit;
12731}
@ SPELL_AURA_MOD_HEALING
Definition: SpellAuraDefines.h:178

References GetAuraEffectsByType(), and SPELL_AURA_MOD_HEALING.

Referenced by SpellHealingBonusTaken().

◆ SpellCriticalDamageBonus()

uint32 Unit::SpellCriticalDamageBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12268{
12269 // Calculate critical bonus
12270 int32 crit_bonus = damage;
12271 float crit_mod = 0.0f;
12272
12273 switch (spellProto->DmgClass)
12274 {
12275 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12278 crit_bonus += damage;
12279 break;
12280 default:
12281 crit_bonus += damage / 2; // for spells is 50%
12282 break;
12283 }
12284
12285 if (caster)
12286 {
12287 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellProto->GetSchoolMask());
12288
12289 if (victim)
12290 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, victim->GetCreatureTypeMask());
12291
12292 if (crit_bonus != 0 && crit_mod != 0.0f)
12293 AddPct(crit_bonus, crit_mod);
12294
12295 crit_bonus -= damage;
12296
12297 // adds additional damage to critBonus (from talents)
12298 if (Player* modOwner = caster->GetSpellModOwner())
12299 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12300
12301 crit_bonus += damage;
12302 }
12303
12304 return crit_bonus;
12305}

References AddPct(), SpellInfo::DmgClass, GetCreatureTypeMask(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellCriticalHealingBonus()

uint32 Unit::SpellCriticalHealingBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12308{
12309 // Calculate critical bonus
12310 int32 crit_bonus;
12311 switch (spellProto->DmgClass)
12312 {
12313 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12316 crit_bonus = damage;
12317 break;
12318 default:
12319 crit_bonus = damage / 2; // for spells is 50%
12320 break;
12321 }
12322
12323 if (caster)
12324 {
12325 if (victim)
12326 {
12327 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
12328 crit_bonus = int32(crit_bonus * caster->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, creatureTypeMask));
12329 }
12330
12331 // adds additional damage to critBonus (from talents)
12332 // xinef: used for death knight death coil
12333 if (Player* modOwner = caster->GetSpellModOwner())
12334 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12335 }
12336
12337 if (crit_bonus > 0)
12338 damage += crit_bonus;
12339
12340 if (caster)
12341 damage = int32(float(damage) * caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT));
12342
12343 return damage;
12344}
@ SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT
Definition: SpellAuraDefines.h:113

References SpellInfo::DmgClass, GetCreatureTypeMask(), GetSpellModOwner(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by Spell::DoAllEffectOnTarget(), and AuraEffect::HandlePeriodicHealAurasTick().

◆ SpellDamageBonusDone()

uint32 Unit::SpellDamageBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
11602{
11603 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11604 return pdamage;
11605
11606 // Some spells don't benefit from done mods
11607 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11608 return pdamage;
11609
11610 // For totems get damage bonus from owner
11611 if (IsCreature())
11612 {
11613 if (IsTotem())
11614 {
11615 if (Unit* owner = GetOwner())
11616 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, effIndex, TotalMod, stack);
11617 }
11618 // Dancing Rune Weapon...
11619 else if (GetEntry() == 27893)
11620 {
11621 if (Unit* owner = GetOwner())
11622 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, TotalMod, stack) / 2;
11623 }
11624 }
11625
11626 // Done total percent damage auras
11627 float ApCoeffMod = 1.0f;
11628 int32 DoneTotal = 0;
11629 float DoneTotalMod = TotalMod ? TotalMod : SpellPctDamageModsDone(victim, spellProto, damagetype);
11630
11631 // Config : RATE_CREATURE_X_SPELLDAMAGE & Do Not Modify Pet/Guardian/Mind Controled Damage
11633 DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank);
11634
11635 // Some spells don't benefit from pct done mods
11636 if (!spellProto->HasAttribute(SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS))
11637 {
11638 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11639 // Add flat bonus from spell damage versus
11641 }
11642
11643 // done scripted mod (take it from owner)
11644 Unit* owner = GetOwner() ? GetOwner() : this;
11645 int32 DoneAdvertisedBenefit = 0;
11646 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11647 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11648 {
11649 if (!(*i)->IsAffectedOnSpell(spellProto))
11650 continue;
11651
11652 switch ((*i)->GetMiscValue())
11653 {
11654 case 4418: // Increased Shock Damage
11655 case 4554: // Increased Lightning Damage
11656 case 4555: // Improved Moonfire
11657 case 5142: // Increased Lightning Damage
11658 case 5147: // Improved Consecration / Libram of Resurgence
11659 case 5148: // Idol of the Shooting Star
11660 case 6008: // Increased Lightning Damage
11661 case 8627: // Totem of Hex
11662 {
11663 DoneAdvertisedBenefit += (*i)->GetAmount();
11664 break;
11665 }
11666 }
11667 }
11668
11669 // Custom scripted damage
11670 switch (spellProto->SpellFamilyName)
11671 {
11672 case SPELLFAMILY_DRUID:
11673 {
11674 // Insect Swarm vs Item - Druid T8 Balance Relic
11675 if (spellProto->SpellFamilyFlags[0] & 0x00200000)
11676 {
11677 if (AuraEffect const* relicAurEff = GetAuraEffect(64950, EFFECT_0))
11678 {
11679 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11680 }
11681 }
11682
11683 // Nourish vs Idol of the Flourishing Life
11684 if (spellProto->SpellFamilyFlags[1] & 0x02000000)
11685 {
11686 if (AuraEffect const* relicAurEff = GetAuraEffect(64949, EFFECT_0))
11687 {
11688 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11689 }
11690 }
11691 break;
11692 }
11694 {
11695 // Sigil of the Vengeful Heart
11696 if (spellProto->SpellFamilyFlags[0] & 0x2000)
11697 {
11698 if (AuraEffect* aurEff = GetAuraEffect(64962, EFFECT_1))
11699 {
11700 AddPct(DoneTotal, aurEff->GetAmount());
11701 }
11702 }
11703
11704 // Impurity
11706 {
11707 AddPct(ApCoeffMod, aurEff->GetAmount());
11708 }
11709
11710 // Blood Boil - bonus for diseased targets
11711 if ((spellProto->SpellFamilyFlags[0] & 0x00040000) && victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0, 0x00000002, GetGUID()))
11712 {
11713 DoneTotal += 95;
11714 ApCoeffMod = 1.5835f;
11715 }
11716 break;
11717 }
11718 default:
11719 break;
11720 }
11721
11722 // Done fixed damage bonus auras
11723 DoneAdvertisedBenefit += SpellBaseDamageBonusDone(spellProto->GetSchoolMask());
11724
11725 // Check for table values
11726 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
11727 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11728 if (bonus)
11729 {
11730 if (damagetype == DOT)
11731 {
11732 coeff = bonus->dot_damage;
11733 if (bonus->ap_dot_bonus > 0)
11734 {
11735 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11737 APbonus += GetTotalAttackPowerValue(attType);
11738 DoneTotal += int32(bonus->ap_dot_bonus * stack * ApCoeffMod * APbonus);
11739 }
11740 }
11741 else
11742 {
11743 coeff = bonus->direct_damage;
11744 if (bonus->ap_bonus > 0)
11745 {
11746 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11748 APbonus += GetTotalAttackPowerValue(attType);
11749 DoneTotal += int32(bonus->ap_bonus * stack * ApCoeffMod * APbonus);
11750 }
11751 }
11752 }
11753
11754 // Default calculation
11755 if (coeff && DoneAdvertisedBenefit)
11756 {
11757 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11758
11759 if (Player* modOwner = GetSpellModOwner())
11760 {
11761 coeff *= 100.0f;
11762 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
11763 coeff /= 100.0f;
11764 }
11765
11766 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
11767 }
11768
11769 float tmpDamage = (float(pdamage) + DoneTotal) * DoneTotalMod;
11770 // apply spellmod to Done damage (flat and pct)
11771 if (Player* modOwner = GetSpellModOwner())
11772 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, tmpDamage);
11773
11774 return uint32(std::max(tmpDamage, 0.0f));
11775}
@ SPELLMOD_DOT
Definition: SpellDefines.h:98
@ SPELLMOD_BONUS_MULTIPLIER
Definition: SpellDefines.h:100
@ SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS
Definition: SpellAuraDefines.h:243
@ SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS
Definition: SharedDefines.h:633
float GetSpellDamageMod(int32 Rank)
Definition: Creature.cpp:1610
float SpellPctDamageModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition: Unit.cpp:11270
float CalculateLevelPenalty(SpellInfo const *spellProto) const
Definition: Unit.cpp:3040
Definition: SpellMgr.h:324
float ap_dot_bonus
Definition: SpellMgr.h:328
float dot_damage
Definition: SpellMgr.h:326
float ap_bonus
Definition: SpellMgr.h:327
float direct_damage
Definition: SpellMgr.h:325

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, EFFECT_0, EFFECT_1, SpellInfo::Effects, GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), SpellInfo::GetSchoolMask(), Creature::GetSpellDamageMod(), GetSpellModOwner(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IsControlledByPlayer(), Object::IsCreature(), IsGuardian(), IsPet(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_DAMAGE_CLASS_MELEE, SpellBaseDamageBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctDamageModsDone(), sSpellMgr, and Object::ToCreature().

Referenced by spell_warl_seed_of_corruption_aura::CalculateAmount(), AuraEffect::CalculateAmount(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), spell_warr_bloodthirst::HandleDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ SpellDamageBonusTaken()

uint32 Unit::SpellDamageBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint32  stack = 1 
)
11778{
11779 if (!spellProto || damagetype == DIRECT_DAMAGE)
11780 return pdamage;
11781
11782 int32 TakenTotal = 0;
11783 float TakenTotalMod = 1.0f;
11784
11785 // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
11786 // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085)
11788 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
11789 if (((*i)->GetMiscValue() & spellProto->GetSchoolMask()))
11790 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11791 AddPct(TakenTotalMod, (*i)->GetAmount());
11792
11793 TakenTotalMod = processDummyAuras(TakenTotalMod);
11794
11795 // From caster spells
11796 if (caster)
11797 {
11799 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
11800 if ((*i)->GetCasterGUID() == caster->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
11801 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11802 AddPct(TakenTotalMod, (*i)->GetAmount());
11803 }
11804
11805 if (uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask())
11806 {
11807 int32 modifierMax = 0;
11808 int32 modifierMin = 0;
11810 for (AuraEffectList::const_iterator i = auraEffectList.begin(); i != auraEffectList.end(); ++i)
11811 {
11812 if (!spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11813 continue;
11814
11815 // Only death knight spell with this aura
11816 if ((*i)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
11817 if (!caster || caster->GetGUID() != (*i)->GetCasterGUID())
11818 continue;
11819
11820 if (mechanicMask & uint32(1 << (*i)->GetMiscValue()))
11821 {
11822 if ((*i)->GetAmount() > 0)
11823 {
11824 if ((*i)->GetAmount() > modifierMax)
11825 modifierMax = (*i)->GetAmount();
11826 }
11827 else if ((*i)->GetAmount() < modifierMin)
11828 modifierMin = (*i)->GetAmount();
11829 }
11830 }
11831
11832 AddPct(TakenTotalMod, modifierMax);
11833 AddPct(TakenTotalMod, modifierMin);
11834 }
11835
11836 int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask(), damagetype == DOT);
11837
11838 // Check for table values
11839 float coeff = 0;
11840 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11841 if (bonus)
11842 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
11843
11844 // Default calculation
11845 if (TakenAdvertisedBenefit)
11846 {
11847 if (coeff <= 0.0f)
11848 {
11849 if (caster)
11850 coeff = caster->CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11851 else
11852 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11853 }
11854
11855 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11856 TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod);
11857 }
11858
11859 // No positive taken bonus, custom attr
11860 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
11861 {
11862 TakenTotal = 0;
11863 TakenTotalMod = 1.0f;
11864 }
11865
11866 // xinef: sanctified wrath talent
11867 if (caster && TakenTotalMod < 1.0f && caster->HasAuraType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST))
11868 {
11869 float ignoreModifier = 1.0f - TakenTotalMod;
11870 bool addModifier = false;
11872 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
11873 if ((*j)->GetMiscValue() & spellProto->SchoolMask)
11874 {
11875 ApplyPct(ignoreModifier, (*j)->GetAmount());
11876 addModifier = true;
11877 }
11878
11879 if (addModifier)
11880 TakenTotalMod += ignoreModifier;
11881 }
11882
11883 float tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod;
11884
11885 return uint32(std::max(tmpDamage, 0.0f));
11886}
float CalculateDefaultCoefficient(SpellInfo const *spellInfo, DamageEffectType damagetype) const
Definition: Unit.cpp:17183

References AddPct(), ApplyPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, DOT, SpellBonusEntry::dot_damage, SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), SpellInfo::Id, processDummyAuras(), SpellInfo::SchoolMask, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, sSpellMgr, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by DealMeleeDamage(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and spell_black_temple_l5_arcane_charge::PrepareSpellScript().

◆ SpellDoneCritChance()

float Unit::SpellDoneCritChance ( Unit const *  ,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
11981{
11982 // Mobs can't crit with spells.
11983 if (IsCreature() && !GetSpellModOwner())
11984 return -100.0f;
11985
11986 // not critting spell
11987 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
11988 return 0.0f;
11989
11990 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
11991 if (!skipEffectCheck && !spellProto->IsCritCapable())
11992 return 0.0f;
11993
11994 float crit_chance = 0.0f;
11995 switch (spellProto->DmgClass)
11996 {
11998 {
11999 if (schoolMask & SPELL_SCHOOL_MASK_NORMAL)
12000 crit_chance = 0.0f;
12001 // For other schools
12002 else if (IsPlayer())
12003 crit_chance = GetFloatValue(static_cast<uint16>(PLAYER_SPELL_CRIT_PERCENTAGE1) + GetFirstSchoolInMask(schoolMask));
12004 else
12005 {
12006 crit_chance = (float)m_baseSpellCritChance;
12008 }
12009 break;
12010 }
12013 {
12014 if (IsPlayer())
12015 {
12016 switch (attackType)
12017 {
12018 case BASE_ATTACK:
12020 break;
12021 case OFF_ATTACK:
12023 break;
12024 case RANGED_ATTACK:
12026 break;
12027 default:
12028 break;
12029 }
12030 }
12031 else
12032 {
12033 crit_chance = 5.0f;
12036 }
12038 break;
12039 }
12040 // values overridden in spellmgr for lifebloom and earth shield
12042 default:
12043 return 0.0f;
12044 }
12045
12046 // percent done
12047 // only players use intelligence for critical chance computations
12048 if (Player* modOwner = GetSpellModOwner())
12049 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRITICAL_CHANCE, crit_chance);
12050
12051 // xinef: can be negative!
12052 return crit_chance;
12053}
@ SPELLMOD_CRITICAL_CHANCE
Definition: SpellDefines.h:83
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition: SpellAuraDefines.h:134
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition: UpdateFields.h:354
@ SPELL_ATTR2_CANT_CRIT
Definition: SharedDefines.h:485

References BASE_ATTACK, SpellInfo::DmgClass, GetFirstSchoolInMask(), Object::GetFloatValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsCritCapable(), Object::IsPlayer(), m_baseSpellCritChance, OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SPELL_CRIT_PERCENTAGE1, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, SPELL_AURA_MOD_WEAPON_CRIT_PERCENT, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_SCHOOL_MASK_NORMAL, and SPELLMOD_CRITICAL_CHANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget().

◆ SpellHealingBonusDone()

uint32 Unit::SpellHealingBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
12439{
12440 // For totems get healing bonus from owner (statue isn't totem in fact)
12441 if (IsCreature() && IsTotem())
12442 if (Unit* owner = GetOwner())
12443 return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, effIndex, TotalMod, stack);
12444
12445 // No bonus healing for potion spells
12446 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12447 return healamount;
12448
12449 float ApCoeffMod = 1.0f;
12450 float DoneTotalMod = TotalMod ? TotalMod : SpellPctHealingModsDone(victim, spellProto, damagetype);
12451 int32 DoneTotal = 0;
12452
12453 // done scripted mod (take it from owner)
12454 Unit* owner = GetOwner() ? GetOwner() : this;
12455 int32 DoneAdvertisedBenefit = 0;
12456 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12457 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12458 {
12459 if (!(*i)->IsAffectedOnSpell(spellProto))
12460 continue;
12461
12462 switch ((*i)->GetMiscValue())
12463 {
12464 case 4415: // Increased Rejuvenation Healing
12465 case 4953:
12466 DoneAdvertisedBenefit += (*i)->GetAmount();
12467 break;
12468 case 3736: // Hateful Totem of the Third Wind / Increased Lesser Healing Wave / LK Arena (4/5/6) Totem of the Third Wind / Savage Totem of the Third Wind
12469 DoneAdvertisedBenefit += (*i)->GetAmount();
12470 break;
12471 }
12472 }
12473
12474 switch (spellProto->SpellFamilyName)
12475 {
12477 {
12478 // Impurity
12480 {
12481 AddPct(ApCoeffMod, aurEff->GetAmount());
12482 }
12483 break;
12484 }
12485 default:
12486 break;
12487 }
12488
12489 // Done fixed damage bonus auras
12490 DoneAdvertisedBenefit += SpellBaseHealingBonusDone(spellProto->GetSchoolMask());
12491 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
12492
12493 // Check for table values
12494 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12495 if (bonus)
12496 {
12497 if (damagetype == DOT)
12498 {
12499 coeff = bonus->dot_damage;
12500 if (bonus->ap_dot_bonus > 0)
12501 DoneTotal += int32(bonus->ap_dot_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12502 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12503 }
12504 else
12505 {
12506 coeff = bonus->direct_damage;
12507 if (bonus->ap_bonus > 0)
12508 DoneTotal += int32(bonus->ap_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12509 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12510 }
12511 }
12512 else
12513 {
12514 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12515 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12516 return healamount;
12517 }
12518
12519 // Default calculation
12520 if (DoneAdvertisedBenefit)
12521 {
12522 float factorMod = CalculateLevelPenalty(spellProto) * stack;
12523 if (Player* modOwner = GetSpellModOwner())
12524 {
12525 coeff *= 100.0f;
12526 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12527 coeff /= 100.0f;
12528 }
12529 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
12530 }
12531
12532 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12533 {
12534 switch (spellProto->Effects[i].ApplyAuraName)
12535 {
12536 // Bonus healing does not apply to these spells
12539 DoneTotal = 0;
12540 break;
12541 }
12542 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12543 DoneTotal = 0;
12544 }
12545
12546 // use float as more appropriate for negative values and percent applying
12547 float heal = float(int32(healamount) + DoneTotal) * DoneTotalMod;
12548 // apply spellmod to Done amount
12549
12550 if (Player* modOwner = GetSpellModOwner())
12551 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal);
12552
12553 return uint32(std::max(heal, 0.0f));
12554}
@ SPELL_AURA_PERIODIC_HEALTH_FUNNEL
Definition: SpellAuraDefines.h:125
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:12688
float SpellPctHealingModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition: Unit.cpp:12346

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAttackPowerValue(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SpellBaseHealingBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_POTION, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctHealingModsDone(), and sSpellMgr.

Referenced by AuraEffect::CalculateAmount(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_dru_lifebloom::HandleDispel(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHealingBonusTaken()

uint32 Unit::SpellHealingBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint32  stack = 1 
)
12557{
12558 float TakenTotalMod = 1.0f;
12559 float minval = 0.0f;
12560
12561 // Healing taken percent
12562 if (!sScriptMgr->OnSpellHealingBonusTakenNegativeModifiers(this, caster, spellProto, minval))
12563 {
12565 }
12566
12567 if (minval)
12568 AddPct(TakenTotalMod, minval);
12569
12571 if (maxval)
12572 AddPct(TakenTotalMod, maxval);
12573
12574 // Tenacity increase healing % taken
12575 if (AuraEffect const* Tenacity = GetAuraEffect(58549, 0))
12576 AddPct(TakenTotalMod, Tenacity->GetAmount());
12577
12578 // Healing Done
12579 int32 TakenTotal = 0;
12580
12581 // Taken fixed damage bonus auras
12582 int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(spellProto->GetSchoolMask());
12583
12584 // Nourish cast, glyph of nourish
12585 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000 && caster)
12586 {
12587 bool any = false;
12588 bool hasglyph = caster->GetAuraEffectDummy(62971);
12590 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
12591 {
12592 if (((*i)->GetCasterGUID() == caster->GetGUID()))
12593 {
12594 SpellInfo const* spell = (*i)->GetSpellInfo();
12595 // Rejuvenation, Regrowth, Lifebloom, or Wild Growth
12596 if (!any && spell->SpellFamilyFlags.HasFlag(0x50, 0x4000010, 0))
12597 {
12598 TakenTotalMod *= 1.2f;
12599 any = true;
12600 }
12601
12602 if (hasglyph)
12603 TakenTotalMod += 0.06f;
12604 }
12605 }
12606 }
12607
12608 if (damagetype == DOT)
12609 {
12610 // Healing over time taken percent
12611 float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12612 if (minval_hot)
12613 AddPct(TakenTotalMod, minval_hot);
12614
12615 float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12616 if (maxval_hot)
12617 AddPct(TakenTotalMod, maxval_hot);
12618 }
12619
12620 // Check for table values
12621 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12622 float coeff = 0;
12623 float factorMod = 1.0f;
12624 if (bonus)
12625 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
12626 else
12627 {
12628 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12629 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12630 {
12631 healamount = uint32(std::max((float(healamount) * TakenTotalMod), 0.0f));
12632 return healamount;
12633 }
12634 }
12635
12636 // Default calculation
12637 if (TakenAdvertisedBenefit)
12638 {
12639 float TakenCoeff = 0.0f;
12640 if (coeff <= 0)
12641 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack) * 1.88f; // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells)
12642
12643 factorMod *= CalculateLevelPenalty(spellProto) * int32(stack);
12644 if (Player* modOwner = GetSpellModOwner())
12645 {
12646 coeff *= 100.0f;
12647 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12648 coeff /= 100.0f;
12649 }
12650
12651 TakenTotal += int32(TakenAdvertisedBenefit * (coeff > 0 ? coeff : TakenCoeff) * factorMod);
12652 }
12653
12654 if (caster)
12655 {
12657 for (AuraEffectList::const_iterator i = mHealingGet.begin(); i != mHealingGet.end(); ++i)
12658 if (caster->GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectedOnSpell(spellProto))
12659 AddPct(TakenTotalMod, (*i)->GetAmount());
12660 }
12661
12662 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12663 {
12664 switch (spellProto->Effects[i].ApplyAuraName)
12665 {
12666 // Bonus healing does not apply to these spells
12669 TakenTotal = 0;
12670 break;
12671 }
12672 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12673 TakenTotal = 0;
12674 }
12675
12676 // No positive taken bonus, custom attr
12677 if ((spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS) || spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS)) && TakenTotalMod > 1.0f)
12678 {
12679 TakenTotal = 0;
12680 TakenTotalMod = 1.0f;
12681 }
12682
12683 float heal = float(int32(healamount) + TakenTotal) * TakenTotalMod;
12684
12685 return uint32(std::max(heal, 0.0f));
12686}
@ SPELL_AURA_MOD_HEALING_RECEIVED
Definition: SpellAuraDefines.h:346
@ SPELL_AURA_MOD_HEALING_PCT
Definition: SpellAuraDefines.h:181
@ SPELL_AURA_MOD_HOT_PCT
Definition: SpellAuraDefines.h:322
@ SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS
Definition: SharedDefines.h:631
int32 GetMaxPositiveAuraModifier(AuraType auratype)
Definition: Unit.cpp:5935
int32 GetMaxNegativeAuraModifier(AuraType auratype) const
Definition: Unit.cpp:5949
int32 SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask)
Definition: Unit.cpp:12721

References AddPct(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, GetAuraEffect(), GetAuraEffectDummy(), GetAuraEffectsByType(), Object::GetGUID(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), SpellInfo::GetSchoolMask(), flag96::HasFlag(), SpellInfo::Id, SPELL_AURA_MOD_HEALING_PCT, SPELL_AURA_MOD_HOT_PCT, SPELL_AURA_PERIODIC_HEAL, SPELL_DAMAGE_CLASS_NONE, SpellBaseHealingBonusTaken(), SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, sScriptMgr, and sSpellMgr.

Referenced by spell_dru_lifebloom::AfterRemove(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_pri_renew::HandleApplyEffect(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHitResult() [1/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
Spell const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3536{
3537 SpellInfo const* spellInfo = spell->GetSpellInfo();
3538
3539 // Check for immune
3540 if (victim->IsImmunedToSpell(spellInfo, spell))
3541 {
3542 return SPELL_MISS_IMMUNE;
3543 }
3544
3545 // All positive spells can`t miss
3547 if ((spellInfo->IsPositive() || spellInfo->HasEffect(SPELL_EFFECT_DISPEL))
3548 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3549 {
3550 return SPELL_MISS_NONE;
3551 }
3552
3553 // Check for immune
3554 // xinef: check for school immunity only
3555 if (victim->IsImmunedToSchool(spell))
3556 {
3557 return SPELL_MISS_IMMUNE;
3558 }
3559
3560 if (this == victim)
3561 {
3562 return SPELL_MISS_NONE;
3563 }
3564
3565 // Return evade for units in evade mode
3566 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) &&
3568 {
3569 return SPELL_MISS_EVADE;
3570 }
3571
3572 // Try victim reflect spell
3573 if (CanReflect)
3574 {
3575 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3576 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3577 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3578 {
3579 if ((*i)->GetMiscValue() & spell->GetSpellSchoolMask())
3580 {
3581 reflectchance += (*i)->GetAmount();
3582 }
3583 }
3584
3585 if (reflectchance > 0 && roll_chance_i(reflectchance))
3586 {
3587 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3588 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3589 return SPELL_MISS_REFLECT;
3590 }
3591 }
3592
3593 switch (spellInfo->DmgClass)
3594 {
3597 return MeleeSpellHitResult(victim, spellInfo);
3599 {
3600 if (spellInfo->SpellFamilyName)
3601 {
3602 return SPELL_MISS_NONE;
3603 }
3604
3605 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3606 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3607 {
3608 if (spellInfo->Effects[i].Effect && spellInfo->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3609 {
3610 if (spellInfo->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3611 {
3612 return SPELL_MISS_NONE;
3613 }
3614 }
3615 }
3616 [[fallthrough]];
3617 }
3619 return MagicSpellHitResult(victim, spellInfo);
3620 }
3621
3622 return SPELL_MISS_NONE;
3623}
@ SPELL_AURA_REFLECT_SPELLS
Definition: SpellAuraDefines.h:91
@ SPELL_EFFECT_DISPEL
Definition: SharedDefines.h:816
@ SPELL_MISS_IMMUNE
Definition: SharedDefines.h:1526
@ SPELL_MISS_EVADE
Definition: SharedDefines.h:1525
@ SPELL_MISS_REFLECT
Definition: SharedDefines.h:1530
SpellMissInfo MagicSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition: Unit.cpp:3327
SpellMissInfo MeleeSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition: Unit.cpp:3154
uint32 DmgClass
Definition: SpellInfo.h:389

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

◆ SpellHitResult() [2/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
SpellInfo const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3471{
3472 // Check for immune
3473 if (victim->IsImmunedToSpell(spell))
3474 return SPELL_MISS_IMMUNE;
3475
3476 // All positive spells can`t miss
3478 if ((spell->IsPositive() || spell->HasEffect(SPELL_EFFECT_DISPEL))
3479 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3480 return SPELL_MISS_NONE;
3481
3482 // Check for immune
3483 // xinef: check for school immunity only
3484 if (victim->IsImmunedToSchool(spell))
3485 return SPELL_MISS_IMMUNE;
3486
3487 if (this == victim)
3488 return SPELL_MISS_NONE;
3489
3490 // Return evade for units in evade mode
3491 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spell->HasAura(SPELL_AURA_CONTROL_VEHICLE)
3492 && !spell->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE) && !spell->HasAttribute(SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT))
3493 return SPELL_MISS_EVADE;
3494
3495 // Try victim reflect spell
3496 if (CanReflect)
3497 {
3498 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3499 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3500 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3501 if ((*i)->GetMiscValue() & spell->GetSchoolMask())
3502 reflectchance += (*i)->GetAmount();
3503 if (reflectchance > 0 && roll_chance_i(reflectchance))
3504 {
3505 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3506 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3507 return SPELL_MISS_REFLECT;
3508 }
3509 }
3510
3511 switch (spell->DmgClass)
3512 {
3515 return MeleeSpellHitResult(victim, spell);
3517 {
3518 if (spell->SpellFamilyName)
3519 {
3520 return SPELL_MISS_NONE;
3521 }
3522 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3523 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3524 if (spell->Effects[i].Effect && spell->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3525 if (spell->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3526 return SPELL_MISS_NONE;
3527 [[fallthrough]];
3528 }
3530 return MagicSpellHitResult(victim, spell);
3531 }
3532 return SPELL_MISS_NONE;
3533}

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

Referenced by Spell::AddUnitTarget(), DealMeleeDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SpellPctDamageModsDone()

float Unit::SpellPctDamageModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
11271{
11272 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11273 return 1.0f;
11274
11275 // Some spells don't benefit from done mods
11276 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11277 return 1.0f;
11278
11279 // For totems get damage bonus from owner
11280 if (IsCreature())
11281 {
11282 if (IsTotem())
11283 {
11284 if (Unit* owner = GetOwner())
11285 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11286 }
11287 // Dancing Rune Weapon...
11288 else if (GetEntry() == 27893)
11289 {
11290 if (Unit* owner = GetOwner())
11291 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11292 }
11293 }
11294
11295 // Done total percent damage auras
11296 float DoneTotalMod = 1.0f;
11297
11299 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
11300 {
11301 // prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization)
11302 if (spellProto->EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1 &&
11303 !(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && (*i)->GetMiscValue() == SPELL_SCHOOL_MASK_NORMAL)
11304 {
11305 continue;
11306 }
11307
11308 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11309 continue;
11310
11311 if (!sScriptMgr->IsNeedModSpellDamagePercent(this, *i, DoneTotalMod, spellProto))
11312 continue;
11313
11314 if ((*i)->GetMiscValue() & spellProto->GetSchoolMask())
11315 {
11316 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
11317 AddPct(DoneTotalMod, (*i)->GetAmount());
11318 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
11319 AddPct(DoneTotalMod, (*i)->GetAmount());
11320 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
11321 AddPct(DoneTotalMod, (*i)->GetAmount());
11322 }
11323 }
11324
11325 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11327 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
11328 if ((creatureTypeMask & uint32((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11329 AddPct(DoneTotalMod, (*i)->GetAmount());
11330
11331 // bonus against aurastate
11333 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
11334 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11335 AddPct(DoneTotalMod, (*i)->GetAmount());
11336
11337 // done scripted mod (take it from owner)
11338 Unit* owner = GetOwner() ? GetOwner() : this;
11339 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11340 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11341 {
11342 // Xinef: self cast is ommited (because of Rage of Rivendare)
11343 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11344 continue;
11345
11346 // xinef: Molten Fury should work on all spells
11347 switch ((*i)->GetMiscValue())
11348 {
11349 case 4920: // Molten Fury
11350 case 4919:
11351 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11352 AddPct(DoneTotalMod, (*i)->GetAmount());
11353 break;
11354 }
11355
11356 if (!(*i)->IsAffectedOnSpell(spellProto))
11357 continue;
11358
11359 switch ((*i)->GetMiscValue())
11360 {
11361 case 6917: // Death's Embrace
11362 case 6926:
11363 case 6928:
11364 {
11365 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11366 AddPct(DoneTotalMod, (*i)->GetAmount());
11367 break;
11368 }
11369 // Soul Siphon
11370 case 4992:
11371 case 4993:
11372 {
11373 // effect 1 m_amount
11374 int32 maxPercent = (*i)->GetAmount();
11375 // effect 0 m_amount
11376 int32 stepPercent = CalculateSpellDamage(this, (*i)->GetSpellInfo(), 0);
11377 // count affliction effects and calc additional damage in percentage
11378 int32 modPercent = 0;
11379 AuraApplicationMap const& victimAuras = victim->GetAppliedAuras();
11380 for (AuraApplicationMap::const_iterator itr = victimAuras.begin(); itr != victimAuras.end(); ++itr)
11381 {
11382 Aura const* aura = itr->second->GetBase();
11383 SpellInfo const* m_spell = aura->GetSpellInfo();
11384 if (m_spell->SpellFamilyName != SPELLFAMILY_WARLOCK || !(m_spell->SpellFamilyFlags[1] & 0x0004071B || m_spell->SpellFamilyFlags[0] & 0x8044C402))
11385 continue;
11386 modPercent += stepPercent * aura->GetStackAmount();
11387 if (modPercent >= maxPercent)
11388 {
11389 modPercent = maxPercent;
11390 break;
11391 }
11392 }
11393 AddPct(DoneTotalMod, modPercent);
11394 break;
11395 }
11396 case 6916: // Death's Embrace
11397 case 6925:
11398 case 6927:
11399 if (HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, spellProto, this))
11400 AddPct(DoneTotalMod, (*i)->GetAmount());
11401 break;
11402 case 5481: // Starfire Bonus
11403 {
11404 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x200002, 0, 0))
11405 AddPct(DoneTotalMod, (*i)->GetAmount());
11406 break;
11407 }
11408 // Tundra Stalker
11409 // Merciless Combat
11410 case 7277:
11411 {
11412 // Merciless Combat
11413 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
11414 {
11415 if ((spellProto && spellProto->SpellFamilyFlags[0] & 0x2) || spellProto->SpellFamilyFlags[1] & 0x2 )
11416 if (!victim->HealthAbovePct(35))
11417 AddPct(DoneTotalMod, (*i)->GetAmount());
11418 }
11419 // Tundra Stalker
11420 else
11421 {
11422 // Frost Fever (target debuff)
11423 if (victim->HasAura(55095))
11424 AddPct(DoneTotalMod, (*i)->GetAmount());
11425 break;
11426 }
11427 break;
11428 }
11429 // Rage of Rivendare
11430 case 7293:
11431 {
11433 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
11434 break;
11435 }
11436 // Twisted Faith
11437 case 7377:
11438 {
11440 AddPct(DoneTotalMod, (*i)->GetAmount());
11441 break;
11442 }
11443 // Marked for Death
11444 case 7598:
11445 case 7599:
11446 case 7600:
11447 case 7601:
11448 case 7602:
11449 {
11450 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
11451 AddPct(DoneTotalMod, (*i)->GetAmount());
11452 break;
11453 }
11454 // Dirty Deeds
11455 case 6427:
11456 case 6428:
11457 case 6579:
11458 case 6580:
11459 {
11460 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11461 {
11462 // effect 0 has expected value but in negative state
11463 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
11464 AddPct(DoneTotalMod, bonus);
11465 }
11466 break;
11467 }
11468 }
11469 }
11470
11471 // Custom scripted damage
11472 switch (spellProto->SpellFamilyName)
11473 {
11474 case SPELLFAMILY_MAGE:
11475 // Ice Lance
11476 if (spellProto->SpellIconID == 186)
11477 {
11478 if (victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this))
11479 {
11480 // Glyph of Ice Lance
11481 if (owner->HasAura(56377) && victim->GetLevel() > owner->GetLevel())
11482 DoneTotalMod *= 4.0f;
11483 else
11484 DoneTotalMod *= 3.0f;
11485 }
11486 }
11487
11488 // Torment the weak
11489 if (spellProto->SpellFamilyFlags[0] & 0x20600021 || spellProto->SpellFamilyFlags[1] & 0x9000)
11490 if (victim->HasAuraWithMechanic((1 << MECHANIC_SNARE) | (1 << MECHANIC_SLOW_ATTACK)))
11492 AddPct(DoneTotalMod, aurEff->GetAmount());
11493 break;
11494 case SPELLFAMILY_PRIEST:
11495 // Mind Flay
11496 if (spellProto->SpellFamilyFlags[0] & 0x800000)
11497 {
11498 // Glyph of Shadow Word: Pain
11499 if (AuraEffect* aurEff = GetAuraEffect(55687, 0))
11500 // Increase Mind Flay damage if Shadow Word: Pain present on target
11502 AddPct(DoneTotalMod, aurEff->GetAmount());
11503
11504 // Twisted Faith - Mind Flay part
11506 // Increase Mind Flay damage if Shadow Word: Pain present on target
11508 AddPct(DoneTotalMod, aurEff->GetAmount());
11509 }
11510 // Smite
11511 else if (spellProto->SpellFamilyFlags[0] & 0x80)
11512 {
11513 // Glyph of Smite
11514 if (AuraEffect* aurEff = GetAuraEffect(55692, 0))
11515 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x100000, 0, 0, GetGUID()))
11516 AddPct(DoneTotalMod, aurEff->GetAmount());
11517 }
11518 // Shadow Word: Death
11519 else if (spellProto->SpellFamilyFlags[1] & 0x2)
11520 {
11521 // Glyph of Shadow Word: Death
11522 if (AuraEffect* aurEff = GetAuraEffect(55682, 1))
11524 AddPct(DoneTotalMod, aurEff->GetAmount());
11525 }
11526
11527 break;
11529 // Judgement of Vengeance/Judgement of Corruption
11530 if ((spellProto->SpellFamilyFlags[1] & 0x400000) && spellProto->SpellIconID == 2292)
11531 {
11532 // Get stack of Holy Vengeance/Blood Corruption on the target added by caster
11533 uint32 stacks = 0;
11535 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
11536 if (((*itr)->GetId() == 31803 || (*itr)->GetId() == 53742) && (*itr)->GetCasterGUID() == GetGUID())
11537 {
11538 stacks = (*itr)->GetBase()->GetStackAmount();
11539 break;
11540 }
11541 // + 10% for each application of Holy Vengeance/Blood Corruption on the target
11542 if (stacks)
11543 AddPct(DoneTotalMod, 10 * stacks);
11544 }
11545 break;
11546 case SPELLFAMILY_DRUID:
11547 // Thorns
11548 if (spellProto->SpellFamilyFlags[0] & 0x100)
11549 {
11550 // Brambles
11551 if (AuraEffect* aurEff = GetAuraEffectOfRankedSpell(16836, 0))
11552 AddPct(DoneTotalMod, aurEff->GetAmount());
11553 }
11554 break;
11556 // Fire and Brimstone
11557 if (spellProto->SpellFamilyFlags[1] & 0x00020040)
11559 {
11561 for (AuraEffectList::const_iterator i = mDumyAuras.begin(); i != mDumyAuras.end(); ++i)
11562 if ((*i)->GetSpellInfo()->SpellIconID == 3173)
11563 {
11564 AddPct(DoneTotalMod, (*i)->GetAmount());
11565 break;
11566 }
11567 }
11568 // Drain Soul - increased damage for targets under 25 % HP
11569 if (spellProto->SpellFamilyFlags[0] & 0x00004000)
11570 if (!victim->HealthAbovePct(25))
11571 DoneTotalMod *= 4;
11572 // Shadow Bite (15% increase from each dot)
11573 if (spellProto->SpellFamilyFlags[1] & 0x00400000 && IsPet())
11574 if (uint8 count = victim->GetDoTsByCaster(GetOwnerGUID()))
11575 AddPct(DoneTotalMod, 15 * count);
11576 break;
11577 case SPELLFAMILY_HUNTER:
11578 // Steady Shot
11579 if (spellProto->SpellFamilyFlags[1] & 0x1)
11580 if (AuraEffect* aurEff = GetAuraEffect(56826, 0)) // Glyph of Steady Shot
11581 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_HUNTER, 0x00004000, 0, 0, GetGUID()))
11582 AddPct(DoneTotalMod, aurEff->GetAmount());
11583 break;
11585 // Improved Icy Touch
11586 if (spellProto->SpellFamilyFlags[0] & 0x2)
11588 AddPct(DoneTotalMod, aurEff->GetAmount());
11589
11590 // Glacier Rot
11591 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
11593 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
11594 AddPct(DoneTotalMod, aurEff->GetAmount());
11595 break;
11596 }
11597
11598 return DoneTotalMod;
11599}
@ MECHANIC_SLOW_ATTACK
Definition: SharedDefines.h:1333
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition: SharedDefines.h:1293
@ AURA_STATE_CONFLAGRATE
Definition: SharedDefines.h:1306
uint32 GetDiseasesByCaster(ObjectGuid casterGUID, uint8 mode=0)
Definition: Unit.cpp:5821
bool HasAuraWithMechanic(uint32 mechanicMask) const
Definition: Unit.cpp:5792
AuraEffect * GetAuraEffectOfRankedSpell(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition: Unit.cpp:5508
uint32 GetDoTsByCaster(ObjectGuid casterGUID) const
Definition: Unit.cpp:5867

References AddPct(), AURA_STATE_CONFLAGRATE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, CalculateSpellDamage(), DIRECT_DAMAGE, DOT, EFFECT_0, SpellInfo::EquippedItemClass, GetAppliedAuras(), GetAuraEffect(), GetAuraEffectOfRankedSpell(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDoTsByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetLevel(), GetOwner(), GetOwnerGUID(), SpellInfo::GetSchoolMask(), Aura::GetSpellInfo(), Aura::GetStackAmount(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), HealthAbovePct(), Object::IsCreature(), IsPet(), IsTotem(), MECHANIC_SLOW_ATTACK, MECHANIC_SNARE, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM, SPELL_AURA_DUMMY, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sScriptMgr, Object::ToPlayer(), and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by AuraEffect::CalculatePeriodicData(), and SpellDamageBonusDone().

◆ SpellPctHealingModsDone()

float Unit::SpellPctHealingModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
12347{
12348 // For totems get healing bonus from owner (statue isn't totem in fact)
12349 if (IsCreature() && IsTotem())
12350 if (Unit* owner = GetOwner())
12351 return owner->SpellPctHealingModsDone(victim, spellProto, damagetype);
12352
12353 // Some spells don't benefit from done mods
12354 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
12355 return 1.0f;
12356
12357 // xinef: Some spells don't benefit from done mods
12358 if (spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS))
12359 return 1.0f;
12360
12361 // No bonus healing for potion spells
12362 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12363 return 1.0f;
12364
12365 float DoneTotalMod = 1.0f;
12366
12367 // Healing done percent
12369 for (auto const& auraEff : mHealingDonePct)
12370 {
12371 if (!sScriptMgr->IsNeedModHealPercent(this, auraEff, DoneTotalMod, spellProto))
12372 continue;
12373
12374 AddPct(DoneTotalMod, auraEff->GetAmount());
12375 }
12376
12377 // done scripted mod (take it from owner)
12378 Unit* owner = GetOwner() ? GetOwner() : this;
12379 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12380 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12381 {
12382 if (!(*i)->IsAffectedOnSpell(spellProto))
12383 continue;
12384
12385 switch ((*i)->GetMiscValue())
12386 {
12387 case 21: // Test of Faith
12388 case 6935:
12389 case 6918:
12390 if (victim->HealthBelowPct(50))
12391 AddPct(DoneTotalMod, (*i)->GetAmount());
12392 break;
12393 case 7798: // Glyph of Regrowth
12394 {
12396 AddPct(DoneTotalMod, (*i)->GetAmount());
12397 break;
12398 }
12399
12400 case 7871: // Glyph of Lesser Healing Wave
12401 {
12402 // xinef: affected by any earth shield
12403 if (victim->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0, 0x00000400, 0))
12404 AddPct(DoneTotalMod, (*i)->GetAmount());
12405 break;
12406 }
12407 default:
12408 break;
12409 }
12410 }
12411
12412 switch (spellProto->SpellFamilyName)
12413 {
12415 // Talents and glyphs for healing stream totem
12416 if (spellProto->Id == 52042)
12417 {
12418 // Glyph of Healing Stream Totem
12419 if (AuraEffect* dummy = owner->GetAuraEffect(55456, EFFECT_0))
12420 AddPct(DoneTotalMod, dummy->GetAmount());
12421
12422 // Healing Stream totem - Restorative Totems
12423 if (AuraEffect* aurEff = GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 338, 1))
12424 AddPct(DoneTotalMod, aurEff->GetAmount());
12425 }
12426 break;
12427 case SPELLFAMILY_PRIEST:
12428 // T9 HEALING 4P, empowered renew instant heal
12429 if (spellProto->Id == 63544)
12430 if (AuraEffect* aurEff = GetAuraEffect(67202, EFFECT_0))
12431 AddPct(DoneTotalMod, aurEff->GetAmount());
12432 break;
12433 }
12434
12435 return DoneTotalMod;
12436}
@ SPELL_AURA_MOD_HEALING_DONE_PERCENT
Definition: SpellAuraDefines.h:199

References AddPct(), EFFECT_0, GetAuraEffect(), GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::HasAttribute(), HealthBelowPct(), SpellInfo::Id, Object::IsCreature(), IsTotem(), SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_DUMMY, SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SpellInfo::SpellFamilyName, and sScriptMgr.

Referenced by AuraEffect::CalculatePeriodicData(), and SpellHealingBonusDone().

◆ SpellTakenCritChance()

float Unit::SpellTakenCritChance ( Unit const *  caster,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
float  doneChance,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
12056{
12057 // not critting spell
12058 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12059 return 0.0f;
12060
12061 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12062 if (!skipEffectCheck && !spellProto->IsCritCapable())
12063 return 0.0f;
12064
12065 float crit_chance = doneChance;
12066 switch (spellProto->DmgClass)
12067 {
12069 {
12070 if (!spellProto->IsPositive())
12071 {
12072 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
12073 // xinef: apply max and min only
12075 {
12078 }
12079
12080 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_SPELL);
12081 }
12082 // scripted (increase crit chance ... against ... target by x%
12083 if (caster)
12084 {
12085 AuraEffectList const& mOverrideClassScript = caster->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12086 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12087 {
12088 if (!((*i)->IsAffectedOnSpell(spellProto)))
12089 continue;
12090 int32 modChance = 0;
12091 switch ((*i)->GetMiscValue())
12092 {
12093 // Shatter
12094 case 911:
12095 modChance += 16;
12096 [[fallthrough]];
12097 case 910:
12098 modChance += 17;
12099 [[fallthrough]];
12100 case 849:
12101 modChance += 17;
12102 if (!HasAuraState(AURA_STATE_FROZEN, spellProto, caster))
12103 break;
12104 crit_chance += modChance;
12105 break;
12106 case 7917: // Glyph of Shadowburn
12107 if (HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, caster))
12108 crit_chance += (*i)->GetAmount();
12109 break;
12110 case 7997: // Renewed Hope
12111 case 7998:
12112 if (HasAura(6788))
12113 crit_chance += (*i)->GetAmount();
12114 break;
12115 default:
12116 break;
12117 }
12118 }
12119 // Custom crit by class
12120 switch (spellProto->SpellFamilyName)
12121 {
12122 case SPELLFAMILY_MAGE:
12123 // Glyph of Fire Blast
12124 if (spellProto->SpellFamilyFlags[0] == 0x2 && spellProto->SpellIconID == 12)
12126 if (AuraEffect const* aurEff = caster->GetAuraEffect(56369, EFFECT_0))
12127 crit_chance += aurEff->GetAmount();
12128 break;
12129 case SPELLFAMILY_DRUID:
12130 // Improved Faerie Fire
12132 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 109, 0))
12133 crit_chance += aurEff->GetAmount();
12134
12135 // cumulative effect - don't break
12136
12137 // Starfire
12138 if (spellProto->SpellFamilyFlags[0] & 0x4 && spellProto->SpellIconID == 1485)
12139 {
12140 // Improved Insect Swarm
12141 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 1771, 0))
12143 crit_chance += aurEff->GetAmount();
12144 break;
12145 }
12146 break;
12147 case SPELLFAMILY_ROGUE:
12148 // Shiv-applied poisons can't crit
12149 if (caster->FindCurrentSpellBySpellId(5938))
12150 crit_chance = 0.0f;
12151 break;
12153 // Flash of light
12154 if (spellProto->SpellFamilyFlags[0] & 0x40000000)
12155 {
12156 // Sacred Shield
12157 if (AuraEffect const* aura = GetAuraEffect(58597, 1, GetGUID()))
12158 crit_chance += aura->GetAmount();
12159 break;
12160 }
12161 // Exorcism
12162 else if (spellProto->GetCategory() == 19)
12163 {
12165 return 100.0f;
12166 break;
12167 }
12168 break;
12169 case SPELLFAMILY_SHAMAN:
12170 // Lava Burst
12171 if (spellProto->SpellFamilyFlags[1] & 0x00001000)
12172 {
12173 if (GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0, 0, caster->GetGUID()))
12175 return 100.0f;
12176 break;
12177 }
12178 break;
12179 }
12180 }
12181 break;
12182 }
12184 // Custom crit by class
12185 if (caster)
12186 {
12187 switch (spellProto->SpellFamilyName)
12188 {
12189 case SPELLFAMILY_DRUID:
12190 // Rend and Tear - bonus crit chance for Ferocious Bite on bleeding targets
12191 if (spellProto->SpellFamilyFlags[0] & 0x00800000 && spellProto->SpellIconID == 1680 && HasAuraState(AURA_STATE_BLEEDING))
12192 {
12193 if (AuraEffect const* rendAndTear = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 2859, 1))
12194 crit_chance += rendAndTear->GetAmount();
12195 break;
12196 }
12197 break;
12199 // Victory Rush
12200 if (spellProto->SpellFamilyFlags[1] & 0x100)
12201 {
12202 // Glyph of Victory Rush
12203 if (AuraEffect const* aurEff = caster->GetAuraEffect(58382, 0))
12204 crit_chance += aurEff->GetAmount();
12205 break;
12206 }
12207 break;
12208 }
12209 }
12210
12211 // 100% critical chance against sitting target
12213 {
12214 return 100.0f;
12215 }
12216 [[fallthrough]];
12218 {
12219 // flat aura mods
12220 if (attackType == RANGED_ATTACK)
12222 else
12224
12225 // reduce crit chance from Rating for players
12226 if (attackType != RANGED_ATTACK)
12227 {
12228 // xinef: little hack, crit chance dont require caster to calculate, pass victim
12229 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_MELEE);
12230 }
12231 else
12232 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_RANGED);
12233
12234 // Apply crit chance from defence skill
12235 if (caster)
12236 crit_chance += (int32(caster->GetMaxSkillValueForLevel(this)) - int32(GetDefenseSkillValue(caster))) * 0.04f;
12237
12238 break;
12239 }
12240 // values overridden in spellmgr for lifebloom and earth shield
12242 default:
12243 return 0.0f;
12244 }
12245
12246 if (caster)
12247 {
12249 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
12250 {
12251 if (caster->GetGUID() != (*i)->GetCasterGUID())
12252 continue;
12253
12254 crit_chance += (*i)->GetAmount();
12255 }
12256 }
12257
12258 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
12259 // xinef: should be calculated at the end
12260 if (!spellProto->IsPositive())
12262
12263 // xinef: can be negative!
12264 return crit_chance;
12265}
@ SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
Definition: SpellAuraDefines.h:242
uint32 const CREATURE_TYPEMASK_DEMON_OR_UNDEAD
Definition: SharedDefines.h:2643
@ MECHANIC_KNOCKOUT
Definition: SharedDefines.h:1339
@ AURA_STATE_BLEEDING
Definition: SharedDefines.h:1310
@ AURA_STATE_FAERIE_FIRE
Definition: SharedDefines.h:1304
int32 GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
Definition: Unit.cpp:5986
int32 GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:6000

References ApplyResilience(), AURA_STATE_BLEEDING, AURA_STATE_FAERIE_FIRE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_35_PERCENT, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CREATURE_TYPEMASK_DEMON_OR_UNDEAD, SpellInfo::DmgClass, EFFECT_0, FindCurrentSpellBySpellId(), GetAuraEffect(), GetAuraEffectsByType(), SpellInfo::GetCategory(), GetCreatureTypeMask(), GetDefenseSkillValue(), GetDummyAuraEffect(), Object::GetGUID(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxSkillValueForLevel(), getStandState(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraType(), HasAuraWithMechanic(), SpellInfo::IsCritCapable(), Object::IsPlayer(), SpellInfo::IsPositive(), IsSitState(), MECHANIC_KNOCKOUT, MECHANIC_STUN, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLFAMILY_DRUID, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, and UNIT_STAND_STATE_SLEEP.

Referenced by AuraEffect::CalcPeriodicCritChance(), and Spell::DoAllEffectOnLaunchTarget().

◆ StartReactiveTimer()

void Unit::StartReactiveTimer ( ReactiveType  reactive)
inline
#define REACTIVE_TIMER_START
Definition: Unit.h:584

References m_reactiveTimer, and REACTIVE_TIMER_START.

Referenced by ProcDamageAndSpellFor().

◆ StopAttackFaction()

void Unit::StopAttackFaction ( uint32  faction_id)
20157{
20158 if (Unit* victim = GetVictim())
20159 {
20160 if (victim->GetFactionTemplateEntry()->faction == faction_id)
20161 {
20162 AttackStop();
20163 if (IsNonMeleeSpellCast(false))
20165
20166 // melee and ranged forced attack cancel
20167 if (IsPlayer())
20169 }
20170 }
20171
20172 AttackerSet const& attackers = getAttackers();
20173 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20174 {
20175 if ((*itr)->GetFactionTemplateEntry()->faction == faction_id)
20176 {
20177 (*itr)->AttackStop();
20178 itr = attackers.begin();
20179 }
20180 else
20181 ++itr;
20182 }
20183
20185
20186 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20187 (*itr)->StopAttackFaction(faction_id);
20188}
void deleteReferencesForFaction(uint32 faction)
Definition: HostileRefMgr.cpp:162

References AttackStop(), HostileRefMgr::deleteReferencesForFaction(), getAttackers(), getHostileRefMgr(), GetVictim(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by AuraEffect::HandleForceReaction().

◆ StopAttackingInvalidTarget()

void Unit::StopAttackingInvalidTarget ( )
20191{
20192 AttackerSet const& attackers = getAttackers();
20193 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20194 {
20195 Unit* attacker = (*itr);
20196 if (!attacker->IsValidAttackTarget(this))
20197 {
20198 attacker->AttackStop();
20199 if (attacker->IsPlayer())
20200 {
20202 }
20203
20204 for (Unit* controled : attacker->m_Controlled)
20205 {
20206 if (controled->GetVictim() == this && !controled->IsValidAttackTarget(this))
20207 {
20208 controled->AttackStop();
20209 }
20210 }
20211
20212 itr = attackers.begin();
20213 }
20214 else
20215 {
20216 ++itr;
20217 }
20218 }
20219}

References AttackStop(), getAttackers(), GetVictim(), Object::IsPlayer(), IsValidAttackTarget(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by RemoveCharmedBy(), and SetCharmedBy().

◆ StopMoving()

void Unit::StopMoving ( )
16638{
16640
16641 // not need send any packets if not in world or not moving
16642 if (!IsInWorld())
16643 return;
16644
16645 if (movespline->Finalized())
16646 return;
16647
16648 // Update position now since Stop does not start a new movement that can be updated later
16649 if (movespline->HasStarted())
16651
16652 Movement::MoveSplineInit init(this);
16653 init.Stop();
16654}
void UpdateSplinePosition()
Definition: Unit.cpp:607
bool HasStarted() const
Definition: MoveSpline.h:129

References ClearUnitState(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::HasStarted(), Object::IsInWorld(), movespline, Movement::MoveSplineInit::Stop(), UNIT_STATE_MOVING, and UpdateSplinePosition().

Referenced by npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), ScriptedAI::DoCastSpell(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), ChaseMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), WorldSession::HandlePetActionHelper(), RotateMovementGenerator::Initialize(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_kologarn::boss_kologarnAI::JustDied(), boss_swamplord_muselek::JustEngagedWith(), Player::LeaveBattleground(), SmartAI::MoveAway(), boss_headless_horseman::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), PauseMovement(), SmartAI::PausePath(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), RemoveCharmedBy(), Creature::RemoveCorpse(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), boss_leotheras_the_blind::Reset(), IdleMovementGenerator::Reset(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), SmartAI::SetCombatMove(), SetConfused(), boss_victor_nefarius::boss_victor_nefariusAI::SetData(), setDeathState(), SetFeared(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), SetRooted(), npc_magister_aledis::sGossipSelect(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), SmartAI::StopFollow(), SmartAI::StopPath(), CreatureAI::TriggerAlert(), Pet::Update(), TimedFleeingMovementGenerator::Update(), boss_felblood_kaelthas::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), and PetAI::UpdateAI().

◆ StopMovingOnCurrentPos()

void Unit::StopMovingOnCurrentPos ( )
16677{
16679
16680 // not need send any packets if not in world
16681 if (!IsInWorld())
16682 return;
16683
16684 DisableSpline(); // pussywizard: required so Launch() won't recalculate position from previous spline
16685 Movement::MoveSplineInit init(this);
16686 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
16687 init.SetFacing(GetOrientation());
16688 init.Launch();
16689}

References ClearUnitState(), DisableSpline(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsInWorld(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and UNIT_STATE_MOVING.

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), UtherBatteredHiltEvent::Execute(), WorldSession::HandlePetActionHelper(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureCreate(), boss_skadi::boss_skadiAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), SetRooted(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::SpawnAdds(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), Creature::Update(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), and npc_vortex_ride::npc_vortex_rideAI::UpdateAI().

◆ Talk() [1/2]

void Unit::Talk ( std::string_view  text,
ChatMsg  msgType,
Language  language,
float  textRange,
WorldObject const *  target 
)
virtual
21119{
21120 Acore::CustomChatTextBuilder builder(this, msgType, text, language, target);
21123 Cell::VisitWorldObjects(this, worker, textRange);
21124}
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:192
Definition: GridNotifiers.h:592
Definition: GridNotifiers.h:1707
Definition: ChatTextBuilder.h:49

References Cell::VisitWorldObjects().

Referenced by spell_inoculate_nestlewood_owlkin::HandleEffectRemove(), and spell_the_flag_of_ownership::HandleScript().

◆ Talk() [2/2]

void Unit::Talk ( uint32  textId,
ChatMsg  msgType,
float  textRange,
WorldObject const *  target 
)
virtual
21171{
21172 if (!sObjectMgr->GetBroadcastText(textId))
21173 {
21174 LOG_ERROR("entities.unit", "Unit::Talk: `broadcast_text` (ID: {}) was not found", textId);
21175 return;
21176 }
21177
21178 Acore::BroadcastTextBuilder builder(this, msgType, textId, getGender(), target);
21181 Cell::VisitWorldObjects(this, worker, textRange);
21182}
Definition: ChatTextBuilder.h:31

References getGender(), LOG_ERROR, sObjectMgr, and Cell::VisitWorldObjects().

◆ TauntApply()

void Unit::TauntApply ( Unit victim)
14651{
14652 ASSERT(IsCreature());
14653
14654 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14655 return;
14656
14657 if (!CanHaveThreatList())
14658 return;
14659
14660 Creature* creature = ToCreature();
14661
14662 if (creature->HasReactState(REACT_PASSIVE))
14663 return;
14664
14665 Unit* target = GetVictim();
14666 if (target && target == taunter)
14667 return;
14668
14669 SetInFront(taunter);
14670 SetGuidValue(UNIT_FIELD_TARGET, taunter->GetGUID());
14671
14672 if (creature->IsAIEnabled)
14673 creature->AI()->AttackStart(taunter);
14674
14675 //m_ThreatMgr.tauntApply(taunter);
14676}
void SetInFront(WorldObject const *target)
Definition: Unit.cpp:20508

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), REACT_PASSIVE, Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and boss_razorgore::boss_razorgoreAI::OnCharmed().

◆ TauntFadeOut()

void Unit::TauntFadeOut ( Unit taunter)
14681{
14682 ASSERT(IsCreature());
14683
14684 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14685 return;
14686
14687 if (!CanHaveThreatList())
14688 return;
14689
14690 Creature* creature = ToCreature();
14691
14692 if (creature->HasReactState(REACT_PASSIVE))
14693 return;
14694
14695 Unit* target = GetVictim();
14696 if (!target || target != taunter)
14697 return;
14698
14700 {
14701 if (creature->IsAIEnabled)
14703 return;
14704 }
14705
14706 target = creature->SelectVictim(); // might have more taunt auras remaining
14707
14708 if (target && target != taunter)
14709 {
14711 SetInFront(target);
14712 if (creature->IsAIEnabled)
14713 creature->AI()->AttackStart(target);
14714 }
14715}
@ EVADE_REASON_NO_HOSTILES
Definition: CreatureAI.h:89
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
Definition: CreatureAI.cpp:197
bool isThreatListEmpty() const
Definition: ThreatMgr.h:225
Unit * SelectVictim()
Definition: Unit.cpp:14719

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), CreatureAI::EnterEvadeMode(), CreatureAI::EVADE_REASON_NO_HOSTILES, Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), ThreatMgr::isThreatListEmpty(), m_ThreatMgr, REACT_PASSIVE, Creature::SelectVictim(), Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ TextEmote() [1/2]

◆ TextEmote() [2/2]

void Unit::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
virtual

Reimplemented in Player.

21195{
21196 Talk(textId, isBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
21197}

References CHAT_MSG_MONSTER_EMOTE, CHAT_MSG_RAID_BOSS_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToPet()

◆ ToTempSummon() [1/2]

TempSummon * Unit::ToTempSummon ( )
inline
1730{ if (IsSummon()) return reinterpret_cast<TempSummon*>(this); else return nullptr; }

References IsSummon().

Referenced by CreatureAI::_EnterEvadeMode(), _ExitVehicle(), npc_living_mojo::npc_living_mojoAI::AttackStart(), WorldObject::CanSeeOrDetect(), Spell::CheckCast(), Spell::CheckEffectTarget(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Creature::DespawnOnEvade(), Creature::DespawnOrUnsummon(), npc_bone_spike::npc_bone_spikeAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), ThreatMgr::DoAddThreat(), Spell::EffectScriptEffect(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), npc_raging_flames::FixateRandomTarget(), boss_headless_horseman_head::GetOwner(), GetSpellModOwner(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::GetSummoner(), Creature::GetSummonerGUID(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pilgrims_bounty_pass_generic::HandleDummy(), WorldSession::HandlePetActionHelper(), spell_pri_lightwell::HandleScriptEffect(), spell_q11026_a11051_banish_the_demons::HandleScriptEffect(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), npc_pet_gen_imp_in_a_bottle::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), npc_raging_spirit::npc_raging_spiritAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::npc_pet_dk_ghoulAI::JustDied(), npc_pet_pri_shadowfiend::JustDied(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::JustSummoned(), npc_frosthound::npc_frosthoundAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), npc_collapsing_star::npc_collapsing_starAI::JustSummoned(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::JustSummoned(), boss_supremus::JustSummoned(), Kill(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_netherspite_infernal::KilledUnit(), npc_living_mojo::npc_living_mojoAI::MoveInLineOfSight(), WaypointMovementGenerator< Creature >::MovementInform(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::MovementInform(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_claw_tentacle::npc_claw_tentacle(), npc_eye_tentacle::npc_eye_tentacle(), npc_frost_tomb::npc_frost_tombAI::npc_frost_tombAI(), npc_giant_claw_tentacle::npc_giant_claw_tentacle(), npc_giant_eye_tentacle::npc_giant_eye_tentacle(), npc_midsummer_bonfire::npc_midsummer_bonfire(), npc_midsummer_ribbon_pole_target::npc_midsummer_ribbon_pole_target(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), BattlefieldWG::OnCreatureCreate(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), RemoveAllControlled(), RemoveAllMinionsByEntry(), spell_gen_defend::RemoveDummyFromDriver(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), npc_voidtraveler::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), Spell::SendSpellGo(), Spell::SendSpellStart(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_pilgrims_bounty_plate::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SummonedCreatureDies(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_freya_ward::npc_freya_wardAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::UpdateAI(), npc_feedin_da_goolz::npc_feedin_da_goolzAI::UpdateAI(), Player::VehicleSpellInitialize(), and npc_frosthound::npc_frosthoundAI::WaypointReached().

◆ ToTempSummon() [2/2]

const TempSummon * Unit::ToTempSummon ( ) const
inline
1731{ if (IsSummon()) return reinterpret_cast<const TempSummon*>(this); else return nullptr; }

References IsSummon().

◆ ToTotem()

Totem * Unit::ToTotem ( )
inline
1729{ if (IsTotem()) return reinterpret_cast<Totem*>(this); else return nullptr; }
Definition: Totem.h:51

References IsTotem().

Referenced by _UnapplyAura(), Spell::EffectDestroyAllTotems(), WorldSession::HandleTotemDestroyed(), SetMinion(), Spell::SummonGuardian(), and TotemAI::UpdateAI().

◆ TriggerAurasProcOnEvent() [1/3]

void Unit::TriggerAurasProcOnEvent ( CalcDamageInfo damageInfo)
16531{
16532 DamageInfo dmgInfo = DamageInfo(damageInfo);
16533 TriggerAurasProcOnEvent(nullptr, nullptr, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, 0, 0, damageInfo.procEx, nullptr, &dmgInfo, nullptr);
16534}
void TriggerAurasProcOnEvent(CalcDamageInfo &damageInfo)
Definition: Unit.cpp:16530

References CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::target, and TriggerAurasProcOnEvent().

Referenced by TriggerAurasProcOnEvent().

◆ TriggerAurasProcOnEvent() [2/3]

void Unit::TriggerAurasProcOnEvent ( ProcEventInfo eventInfo,
std::list< AuraApplication * > &  procAuras 
)
16556{
16557 for (std::list<AuraApplication*>::iterator itr = aurasTriggeringProc.begin(); itr != aurasTriggeringProc.end(); ++itr)
16558 {
16559 if (!(*itr)->GetRemoveMode())
16560 (*itr)->GetBase()->TriggerProcOnEvent(*itr, eventInfo);
16561 }
16562}

◆ TriggerAurasProcOnEvent() [3/3]

void Unit::TriggerAurasProcOnEvent ( std::list< AuraApplication * > *  myProcAuras,
std::list< AuraApplication * > *  targetProcAuras,
Unit actionTarget,
uint32  typeMaskActor,
uint32  typeMaskActionTarget,
uint32  spellTypeMask,
uint32  spellPhaseMask,
uint32  hitMask,
Spell spell,
DamageInfo damageInfo,
HealInfo healInfo 
)
16537{
16538 // prepare data for self trigger
16539 ProcEventInfo myProcEventInfo = ProcEventInfo(this, actionTarget, actionTarget, typeMaskActor, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16540 std::list<AuraApplication*> myAurasTriggeringProc;
16541 GetProcAurasTriggeredOnEvent(myAurasTriggeringProc, myProcAuras, myProcEventInfo);
16542
16543 // prepare data for target trigger
16544 ProcEventInfo targetProcEventInfo = ProcEventInfo(this, actionTarget, this, typeMaskActionTarget, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16545 std::list<AuraApplication*> targetAurasTriggeringProc;
16546 if (typeMaskActionTarget)
16547 GetProcAurasTriggeredOnEvent(targetAurasTriggeringProc, targetProcAuras, targetProcEventInfo);
16548
16549 TriggerAurasProcOnEvent(myProcEventInfo, myAurasTriggeringProc);
16550
16551 if (typeMaskActionTarget)
16552 TriggerAurasProcOnEvent(targetProcEventInfo, targetAurasTriggeringProc);
16553}
void GetProcAurasTriggeredOnEvent(std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
Definition: Unit.cpp:16500

References GetProcAurasTriggeredOnEvent(), and TriggerAurasProcOnEvent().

◆ UnsummonAllTotems()

void Unit::UnsummonAllTotems ( bool  onDeath = false)
11192{
11193 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
11194 {
11195 if (!m_SummonSlot[i])
11196 {
11197 continue;
11198 }
11199
11200 if (Creature* OldTotem = GetMap()->GetCreature(m_SummonSlot[i]))
11201 {
11202 if (OldTotem->IsSummon())
11203 {
11204 if (!(onDeath && !IsPlayer() && OldTotem->IsGuardian()))
11205 {
11206 OldTotem->ToTempSummon()->UnSummon();
11207 }
11208 }
11209 }
11210 }
11211}

References WorldObject::GetMap(), Object::IsPlayer(), m_SummonSlot, and MAX_SUMMON_SLOT.

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ Update()

void Unit::Update ( uint32  time)
overridevirtual

Reimplemented from WorldObject.

383{
384 sScriptMgr->OnUnitUpdate(this, p_time);
385
386 // WARNING! Order of execution here is important, do not change.
387 // Spells must be processed with event system BEFORE they go to _UpdateSpells.
388 // Or else we may have some SPELL_STATE_FINISHED spells stalled in pointers, that is bad.
389 m_Events.Update(p_time);
390
391 if (!IsInWorld())
392 return;
393
394 // pussywizard:
395 if (!IsPlayer() || (!ToPlayer()->IsBeingTeleported() && !bRequestForcedVisibilityUpdate))
396 {
398 {
400 {
402 //ExecuteDelayedUnitRelocationEvent();
404 }
405 else
407 }
409 {
410 if (m_delayed_unit_ai_notify_timer <= p_time)
411 {
414 }
415 else
417 }
418 }
419
420 _UpdateSpells( p_time );
421
422 if (CanHaveThreatList() && GetThreatMgr().isNeedUpdateToClient(p_time))
424
425 // update combat timer only for players and pets (only pets with PetAI)
427 {
428 // Check UNIT_STATE_MELEE_ATTACKING or UNIT_STATE_CHASE (without UNIT_STATE_FOLLOW in this case) so pets can reach far away
429 // targets without stopping half way there and running off.
430 // These flags are reset after target dies or another command is given.
432 {
433 // m_CombatTimer set at aura start and it will be freeze until aura removing
434 if (m_CombatTimer <= p_time)
436 else
437 m_CombatTimer -= p_time;
438 }
439 }
440
443 {
444 while (!extraAttacksTargets.empty())
445 {
446 auto itr = extraAttacksTargets.begin();
447 ObjectGuid targetGuid = itr->first;
448 uint32 count = itr->second;
449 extraAttacksTargets.erase(itr);
450 if (Unit* victim = ObjectAccessor::GetUnit(*this, targetGuid))
451 {
453 || victim->IsWithinMeleeRange(this))
454 {
455 HandleProcExtraAttackFor(victim, count);
456 }
457 }
458 }
460 }
461
462 // not implemented before 3.0.2
463 // xinef: if attack time > 0, reduce by diff
464 // if on next update, attack time < 0 assume player didnt attack - set to 0
465 bool suspendAttackTimer = false;
466 bool suspendRangedAttackTimer = false;
468 {
469 for (Spell* spell : m_currentSpells)
470 {
471 if (spell)
472 {
473 if (spell->GetSpellInfo()->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
474 {
475 if (spell->IsChannelActive())
476 {
477 suspendRangedAttackTimer = true;
478 }
479
480 suspendAttackTimer = true;
481 break;
482 }
483 }
484 }
485 }
486
487 if (!suspendAttackTimer)
488 {
489 if (int32 base_attack = getAttackTimer(BASE_ATTACK))
490 {
491 setAttackTimer(BASE_ATTACK, base_attack > 0 ? base_attack - (int32) p_time : 0);
492 }
493
494 if (int32 off_attack = getAttackTimer(OFF_ATTACK))
495 {
496 setAttackTimer(OFF_ATTACK, off_attack > 0 ? off_attack - (int32) p_time : 0);
497 }
498 }
499
500 if (!suspendRangedAttackTimer)
501 {
502 if (int32 ranged_attack = getAttackTimer(RANGED_ATTACK))
503 {
504 setAttackTimer(RANGED_ATTACK, ranged_attack > 0 ? ranged_attack - (int32)p_time : 0);
505 }
506 }
507
508 // update abilities available only for fraction of time
509 UpdateReactives(p_time);
510
514
515 UpdateSplineMovement(p_time);
516 GetMotionMaster()->UpdateMotion(p_time);
517
519}
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition: SharedDefines.h:1315
bool IsEmpty() const
Definition: LinkedList.h:97
void Update(uint32 p_time)
Definition: EventProcessor.cpp:40
void _UpdateSpells(uint32 time)
Definition: Unit.cpp:3844
void UpdateSplineMovement(uint32 t_diff)
Definition: Unit.cpp:575
void UpdateReactives(uint32 p_time)
Definition: Unit.cpp:16927
void ExecuteDelayedUnitAINotifyEvent()
Definition: Unit.cpp:20497
void HandleProcExtraAttackFor(Unit *victim, uint32 count)
Definition: Unit.cpp:2756
void SendThreatListUpdate()
Definition: Unit.cpp:20065
std::unordered_set< Unit * > i_objectsForDelayedVisibility
Definition: Map.h:389
void UpdateMotion(uint32 diff)
Definition: MotionMaster.cpp:104

References _lastDamagedTargetGuid, _lastExtraAttackSpell, _UpdateSpells(), AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, bRequestForcedVisibilityUpdate, CanHaveThreatList(), ClearInCombat(), ObjectGuid::Empty, ExecuteDelayedUnitAINotifyEvent(), extraAttacksTargets, WorldObject::FindMap(), getAttackTimer(), GetMotionMaster(), GetThreatMgr(), ObjectAccessor::GetUnit(), HandleProcExtraAttackFor(), HasUnitState(), HasUnitTypeMask(), HealthAbovePct(), HealthBelowPct(), Map::i_objectsForDelayedVisibility, InvalidateValuesUpdateCache(), IsAlive(), IsControlledByPlayer(), LinkedListHead::IsEmpty(), IsInCombat(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), m_CombatTimer, m_currentSpells, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_Events, m_HostileRefMgr, ModifyAuraState(), OFF_ATTACK, RANGED_ATTACK, SendThreatListUpdate(), setAttackTimer(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_HACK_AND_SLASH, SPELL_SWORD_SPECIALIZATION, sScriptMgr, Object::ToPlayer(), UNIT_MASK_CONTROLABLE_GUARDIAN, UNIT_STATE_CASTING, EventProcessor::Update(), MotionMaster::UpdateMotion(), UpdateReactives(), and UpdateSplineMovement().

Referenced by Creature::Update(), and Player::Update().

◆ UpdateAllResistances()

void Unit::UpdateAllResistances ( )
virtual

◆ UpdateAllStats()

virtual bool Unit::UpdateAllStats ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

◆ UpdateArmor()

virtual void Unit::UpdateArmor ( )
pure virtual

◆ UpdateAttackPowerAndDamage()

virtual void Unit::UpdateAttackPowerAndDamage ( bool  ranged = false)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateAuraForGroup()

void Unit::UpdateAuraForGroup ( uint8  slot)
17157{
17158 if (slot >= MAX_AURAS) // slot not found, return
17159 return;
17160 if (Player* player = ToPlayer())
17161 {
17162 if (player->GetGroup())
17163 {
17164 player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_AURAS);
17165 player->SetAuraUpdateMaskForRaid(slot);
17166 }
17167 }
17168 else if (IsCreature() && IsPet())
17169 {
17170 Pet* pet = ((Pet*)this);
17171 if (pet->isControlled())
17172 {
17173 Unit* owner = GetOwner();
17174 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
17175 {
17177 pet->SetAuraUpdateMaskForRaid(slot);
17178 }
17179 }
17180 }
17181}
#define MAX_AURAS
Definition: SpellAuraDefines.h:21
@ GROUP_UPDATE_FLAG_PET_AURAS
Definition: Group.h:118
@ GROUP_UPDATE_FLAG_AURAS
Definition: Group.h:109
void SetAuraUpdateMaskForRaid(uint8 slot)
Definition: Pet.h:137

References Player::GetGroup(), GetOwner(), GROUP_UPDATE_FLAG_AURAS, GROUP_UPDATE_FLAG_PET_AURAS, Pet::isControlled(), Object::IsCreature(), IsPet(), Object::IsPlayer(), MAX_AURAS, Pet::SetAuraUpdateMaskForRaid(), Player::SetGroupUpdateFlag(), and Object::ToPlayer().

Referenced by RemoveVisibleAura(), and SetVisibleAura().

◆ UpdateCharmAI()

void Unit::UpdateCharmAI ( )
15772{
15773 if (IsPlayer())
15774 return;
15775
15776 if (i_disabledAI) // disabled AI must be primary AI
15777 {
15778 if (!IsCharmed())
15779 {
15780 delete i_AI;
15782 i_disabledAI = nullptr;
15783 }
15784 }
15785 else
15786 {
15787 if (IsCharmed())
15788 {
15790 if (isPossessed() || IsVehicle())
15791 i_AI = new PossessedAI(ToCreature());
15792 else
15793 i_AI = new PetAI(ToCreature());
15794 }
15795 }
15796}
Definition: PassiveAI.h:37
Definition: PetAI.h:47

References i_AI, i_disabledAI, IsCharmed(), Object::IsPlayer(), isPossessed(), IsVehicle(), and Object::ToCreature().

Referenced by Creature::Update().

◆ UpdateDamagePhysical()

void Unit::UpdateDamagePhysical ( WeaponAttackType  attType)
virtual

Reimplemented in Guardian, and Totem.

61{
62 float totalMin = 0.f;
63 float totalMax = 0.f;
64
65 float tmpMin, tmpMax;
66 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
67 {
68 CalculateMinMaxDamage(attType, false, true, tmpMin, tmpMax, i);
69 totalMin += tmpMin;
70 totalMax += tmpMax;
71 }
72
73 switch (attType)
74 {
75 case BASE_ATTACK:
76 default:
79 break;
80 case OFF_ATTACK:
83 break;
84 case RANGED_ATTACK:
87 break;
88 }
89}
void SetStatFloatValue(uint16 index, float value)
Definition: Object.cpp:790

References BASE_ATTACK, CalculateMinMaxDamage(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, Object::SetStatFloatValue(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, and UNIT_FIELD_MINRANGEDDAMAGE.

Referenced by Player::_ApplyAmmoBonuses(), Player::_ApplyWeaponDamage(), boss_twin_valkyrAI::boss_twin_valkyrAI(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleModAttackSpeed(), HandleStatModifier(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::npc_toc_enh_shamanAI(), Player::RemoveAmmo(), Creature::SetCanDualWield(), ScriptedAI::SetEquipmentSlots(), Creature::UpdateAttackPowerAndDamage(), and Player::UpdateAttackPowerAndDamage().

◆ UpdateHeight()

void Unit::UpdateHeight ( float  newZ)

Only server-side height update, does not broadcast to client.

20059{
20061 if (IsVehicle())
20063}
void RelocatePassengers()
Definition: Vehicle.cpp:513

References Position::GetPositionX(), Position::GetPositionY(), GetVehicleKit(), IsVehicle(), Position::Relocate(), and Vehicle::RelocatePassengers().

Referenced by npc_dancing_flames::npc_dancing_flamesAI::Reset(), and SetHover().

◆ UpdateInterruptMask()

void Unit::UpdateInterruptMask ( )
755{
756 m_interruptMask = 0;
757 for (AuraApplicationList::const_iterator i = m_interruptableAuras.begin(); i != m_interruptableAuras.end(); ++i)
758 m_interruptMask |= (*i)->GetBase()->GetSpellInfo()->AuraInterruptFlags;
759
761 if (spell->getState() == SPELL_STATE_CASTING)
762 m_interruptMask |= spell->m_spellInfo->ChannelInterruptFlags;
763}

References CURRENT_CHANNELED_SPELL, m_currentSpells, m_interruptableAuras, m_interruptMask, and SPELL_STATE_CASTING.

Referenced by _UnapplyAura(), Spell::finish(), and RemoveAurasWithInterruptFlags().

◆ UpdateMaxHealth()

virtual void Unit::UpdateMaxHealth ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateMaxPower()

virtual void Unit::UpdateMaxPower ( Powers  power)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateObjectVisibility()

◆ UpdateOrientation()

void Unit::UpdateOrientation ( float  orientation)

Only server-side orientation update, does not broadcast to client.

20051{
20052 SetOrientation(orientation);
20053 if (IsVehicle())
20055}

References GetVehicleKit(), IsVehicle(), Vehicle::RelocatePassengers(), and Position::SetOrientation().

Referenced by Spell::UpdateChanneledTargetList(), and UpdatePosition().

◆ UpdatePosition() [1/2]

bool Unit::UpdatePosition ( const Position pos,
bool  teleport = false 
)
inline

◆ UpdatePosition() [2/2]

bool Unit::UpdatePosition ( float  x,
float  y,
float  z,
float  ang,
bool  teleport = false 
)
virtual

Reimplemented in Player.

20013{
20014 if (!Acore::IsValidMapCoord(x, y, z, orientation))
20015 return false;
20016
20017 float old_orientation = GetOrientation();
20018 float current_z = GetPositionZ();
20019 bool turn = (old_orientation != orientation);
20020 bool relocated = (teleport || GetPositionX() != x || GetPositionY() != y || current_z != z);
20021
20022 if (!GetVehicle())
20023 {
20024 uint32 mask = 0;
20025 if (turn) mask |= AURA_INTERRUPT_FLAG_TURNING;
20026 if (relocated) mask |= AURA_INTERRUPT_FLAG_MOVE;
20027 if (mask)
20029 }
20030
20031 if (relocated)
20032 {
20033 if (IsPlayer())
20034 GetMap()->PlayerRelocation(ToPlayer(), x, y, z, orientation);
20035 else
20036 GetMap()->CreatureRelocation(ToCreature(), x, y, z, orientation);
20037 }
20038 else if (turn)
20039 {
20040 UpdateOrientation(orientation);
20041
20042 if (IsPlayer() && ToPlayer()->GetFarSightDistance())
20044 }
20045
20046 return (relocated || turn);
20047}
bool IsValidMapCoord(float c)
Definition: GridDefines.h:216
void UpdateOrientation(float orientation)
Only server-side orientation update, does not broadcast to client.
Definition: Unit.cpp:20050
void PlayerRelocation(Player *, float x, float y, float z, float o)
Definition: Map.cpp:1000
void CreatureRelocation(Creature *creature, float x, float y, float z, float o)
Definition: Map.cpp:1022

References AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, Map::CreatureRelocation(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetVehicle(), Object::IsPlayer(), Acore::IsValidMapCoord(), Map::PlayerRelocation(), RemoveAurasWithInterruptFlags(), Object::ToCreature(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdateOrientation().

Referenced by npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_taldaram::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleMoveRootAck(), WorldSession::HandleMoveUnRootAck(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), NearTeleportTo(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), boss_skadi::boss_skadiAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_escortAI::SetNextWaypoint(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), Player::UpdatePosition(), and UpdateSplinePosition().

◆ UpdateReactives()

void Unit::UpdateReactives ( uint32  p_time)
16928{
16929 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
16930 {
16931 ReactiveType reactive = ReactiveType(i);
16932
16933 if (!m_reactiveTimer[reactive])
16934 continue;
16935
16936 if (m_reactiveTimer[reactive] <= p_time)
16937 {
16938 m_reactiveTimer[reactive] = 0;
16939
16940 switch (reactive)
16941 {
16942 case REACTIVE_DEFENSE:
16945 break;
16949 break;
16950 case REACTIVE_OVERPOWER:
16952 {
16954 }
16955 break;
16957 if (IsHunterPet())
16959 break;
16960 default:
16961 break;
16962 }
16963 }
16964 else
16965 {
16966 m_reactiveTimer[reactive] -= p_time;
16967 }
16968 }
16969}
ReactiveType
Definition: Unit.h:587

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), IsHunterPet(), m_reactiveTimer, MAX_REACTIVE, ModifyAuraState(), REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, and REACTIVE_WOLVERINE_BITE.

Referenced by Update().

◆ UpdateResistances()

virtual void Unit::UpdateResistances ( uint32  school)
pure virtual

Implemented in Creature, Player, and Totem.

Referenced by HandleStatModifier(), and UpdateAllResistances().

◆ UpdateSpeed()

void Unit::UpdateSpeed ( UnitMoveType  mtype,
bool  forced 
)
Todo:
possible affect only on MOVE_RUN
14237{
14238 int32 main_speed_mod = 0;
14239 float stack_bonus = 1.0f;
14240 float non_stack_bonus = 1.0f;
14241
14242 switch (mtype)
14243 {
14244 // Only apply debuffs
14245 case MOVE_FLIGHT_BACK:
14246 case MOVE_RUN_BACK:
14247 case MOVE_SWIM_BACK:
14248 case MOVE_WALK:
14249 break;
14250 case MOVE_RUN:
14251 {
14252 if (IsMounted()) // Use on mount auras
14253 {
14257 }
14258 else
14259 {
14263 }
14264 break;
14265 }
14266 case MOVE_SWIM:
14267 {
14268 // xinef: check for forced_speed_mod of sea turtle
14270 for (Unit::AuraEffectList::const_iterator itr = swimAuras.begin(); itr != swimAuras.end(); ++itr)
14271 {
14272 // xinef: sea turtle only, it is not affected by any increasing / decreasing effects
14273 if ((*itr)->GetId() == 64731 /*SPELL_SEA_TURTLE*/)
14274 {
14275 SetSpeed(mtype, AddPct(non_stack_bonus, (*itr)->GetAmount()), forced);
14276 return;
14277 }
14278 else if (
14279 // case: increase speed
14280 ((*itr)->GetAmount() > 0 && (*itr)->GetAmount() > main_speed_mod) ||
14281 // case: decrease speed
14282 ((*itr)->GetAmount() < 0 && (*itr)->GetAmount() < main_speed_mod)
14283 )
14284 {
14285 main_speed_mod = (*itr)->GetAmount();
14286 }
14287 }
14288 break;
14289 }
14290 case MOVE_FLIGHT:
14291 {
14292 if (IsCreature() && IsControlledByPlayer()) // not sure if good for pet
14293 {
14296
14297 // for some spells this mod is applied on vehicle owner
14298 int32 owner_speed_mod = 0;
14299
14300 if (Unit* owner = GetCharmer())
14301 owner_speed_mod = owner->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED);
14302
14303 main_speed_mod = std::max(main_speed_mod, owner_speed_mod);
14304 }
14305 else if (IsMounted())
14306 {
14310 }
14311 else // Use not mount (shapeshift for example) auras (should stack)
14312 {
14316 }
14317
14318 // Update speed for vehicle if available
14319 if (IsPlayer() && GetVehicle())
14321 break;
14322 }
14323 default:
14324 LOG_ERROR("entities.unit", "Unit::UpdateSpeed: Unsupported move type ({})", mtype);
14325 return;
14326 }
14327
14328 // now we ready for speed calculation
14329 float speed = std::max(non_stack_bonus, stack_bonus);
14330 if (main_speed_mod)
14331 AddPct(speed, main_speed_mod);
14332
14333 switch (mtype)
14334 {
14335 case MOVE_RUN:
14336 case MOVE_SWIM:
14337 case MOVE_FLIGHT:
14338 {
14339 // Set creature speed rate
14340 if (IsCreature())
14341 {
14342 if (IsPet() && ToPet()->isControlled() && IsControlledByPlayer())
14343 {
14344 // contant value for player pets
14345 speed *= 1.15f;
14346 }
14347 else
14348 {
14349 speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
14350 }
14351 }
14352
14353 // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
14356 {
14357 if (Creature* creature = ToCreature())
14358 {
14359 uint32 immuneMask = creature->GetCreatureTemplate()->MechanicImmuneMask;
14360 if (immuneMask & (1 << (MECHANIC_SNARE - 1)) || immuneMask & (1 << (MECHANIC_DAZE - 1)))
14361 break;
14362 }
14363
14364 // Use speed from aura
14365 float max_speed = normalization / (IsControlledByPlayer() ? playerBaseMoveSpeed[mtype] : baseMoveSpeed[mtype]);
14366 if (speed > max_speed)
14367 speed = max_speed;
14368 }
14369 break;
14370 }
14371 default:
14372 break;
14373 }
14374
14375 int32 slowFromHealth = 0;
14376 Creature* creature = ToCreature();
14377 // ignore pets, player owned vehicles, and mobs immune to snare
14378 if (creature
14379 && !IsPet()
14380 && !(IsControlledByPlayer() && IsVehicle())
14382 && !(creature->IsDungeonBoss()))
14383 {
14384 // 1.6% for each % under 30.
14385 // use min(0, health-30) so that we don't boost mobs above 30.
14386 slowFromHealth = (int32) std::min(0.0f, (1.66f * (GetHealthPct() - 30.0f)));
14387 }
14388
14389 if (slowFromHealth)
14390 {
14391 AddPct(speed, slowFromHealth);
14392 }
14393
14394 // Apply strongest slow aura mod to speed
14396 if (slow)
14397 AddPct(speed, slow);
14398
14399 if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED))
14400 {
14401 float base_speed = (IsCreature() ? ToCreature()->GetCreatureTemplate()->speed_run : 1.0f);
14402 float min_speed = base_speed * (minSpeedMod / 100.0f);
14403 if (speed < min_speed)
14404 speed = min_speed;
14405 }
14406
14407 SetSpeed(mtype, speed, forced);
14408}
@ SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED
Definition: SpellAuraDefines.h:269
@ SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS
Definition: SpellAuraDefines.h:272
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition: SpellAuraDefines.h:94
@ SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS
Definition: SpellAuraDefines.h:271
@ SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:235
@ SPELL_AURA_MOD_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:234
@ SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING
Definition: SpellAuraDefines.h:273
@ SPELL_AURA_MOD_INCREASE_SWIM_SPEED
Definition: SpellAuraDefines.h:121
@ SPELL_AURA_MOD_MINIMUM_SPEED
Definition: SpellAuraDefines.h:368
@ SPELL_AURA_MOD_SPEED_ALWAYS
Definition: SpellAuraDefines.h:192
@ SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING
Definition: SpellAuraDefines.h:274
@ SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS
Definition: SpellAuraDefines.h:193
@ SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED
Definition: SpellAuraDefines.h:95
@ SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
Definition: SpellAuraDefines.h:254
@ MECHANIC_DAZE
Definition: SharedDefines.h:1352
float speed_run
Definition: CreatureData.h:202
void SetSpeed(UnitMoveType mtype, float rate, bool forced=false)
Definition: Unit.cpp:14415

References AddPct(), baseMoveSpeed, GetAuraEffectsByType(), GetCharmer(), Creature::GetCreatureTemplate(), GetHealthPct(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), GetTotalAuraModifier(), GetTotalAuraMultiplier(), GetVehicle(), GetVehicleBase(), Creature::HasMechanicTemplateImmunity(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsDungeonBoss(), IsMounted(), IsPet(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MECHANIC_DAZE, MECHANIC_SNARE, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_WALK, playerBaseMoveSpeed, SetSpeed(), CreatureTemplate::speed_run, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING, SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING, SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED, SPELL_AURA_MOD_INCREASE_SPEED, SPELL_AURA_MOD_INCREASE_SWIM_SPEED, SPELL_AURA_MOD_MINIMUM_SPEED, SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK, SPELL_AURA_MOD_SPEED_ALWAYS, SPELL_AURA_MOD_SPEED_NOT_STACK, SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED, Object::ToCreature(), ToPet(), and UpdateSpeed().

Referenced by Creature::DoFleeToGetAssistance(), AuraEffect::HandleAuraModDecreaseSpeed(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModIncreaseSpeed(), AuraEffect::HandleAuraModIncreaseSwimSpeed(), AuraEffect::HandleAuraModUseNormalSpeed(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), RemoveCharmedBy(), SetHealth(), SetInCombatState(), SetSpeed(), and UpdateSpeed().

◆ UpdateSplineMovement()

void Unit::UpdateSplineMovement ( uint32  t_diff)
private
576{
577 if (movespline->Finalized())
578 return;
579
580 // xinef: process movementinform
581 // this code cant be placed inside EscortMovementGenerator, because we cant delete active MoveGen while it is updated
582 SplineHandler handler(this);
583 movespline->updateState(t_diff, handler);
584 // Xinef: Spline was cleared by StopMoving, return
585 if (!movespline->Initialized())
586 {
588 return;
589 }
590
591 bool arrived = movespline->Finalized();
592
593 if (arrived)
594 {
596
597 if (movespline->HasAnimation() && IsCreature() && IsAlive())
599 }
600
601 // pussywizard: update always! not every 400ms, because movement generators need the actual position
602 //m_movesplineTimer.Update(t_diff);
603 //if (m_movesplineTimer.Passed() || arrived)
605}
@ UNIT_BYTES_1_OFFSET_ANIM_TIER
Definition: UnitDefines.h:26
Definition: Unit.cpp:555
uint8 GetAnimationType() const
Definition: MoveSpline.h:125
void updateState(int32 difftime, UpdateHandler &handler)
Definition: MoveSpline.h:98
bool HasAnimation() const
Definition: MoveSpline.h:124

References DisableSpline(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::GetAnimationType(), Movement::MoveSpline::HasAnimation(), Movement::MoveSpline::Initialized(), IsAlive(), Object::IsCreature(), movespline, Object::SetByteValue(), UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_FIELD_BYTES_1, UpdateSplinePosition(), and Movement::MoveSpline::updateState().

Referenced by Update().

◆ UpdateSplinePosition()

void Unit::UpdateSplinePosition ( )
private
608{
609 //static uint32 const positionUpdateDelay = 400;
610
611 //m_movesplineTimer.Reset(positionUpdateDelay);
613
615 {
617 pos.m_positionX = loc.x;
618 pos.m_positionY = loc.y;
619 pos.m_positionZ = loc.z;
621
622 if (TransportBase* transport = GetDirectTransport())
623 transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, &loc.orientation);
624 }
625
626 // Xinef: if we had spline running update orientation along with position
627 //if (HasUnitState(UNIT_STATE_CANNOT_TURN))
628 // loc.orientation = GetOrientation();
629
630 if (IsPlayer())
631 UpdatePosition(loc.x, loc.y, loc.z, loc.orientation);
632 else
633 ToCreature()->SetPosition(loc.x, loc.y, loc.z, loc.orientation);
634}
void SetPosition(float x, float y, float z, float o)
Definition: Creature.cpp:3153
Position pos
Definition: Object.h:297
float m_positionZ
Definition: Position.h:58
float m_positionX
Definition: Position.h:56
float m_positionY
Definition: Position.h:57
TransportBase * GetDirectTransport() const
Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
Definition: Unit.cpp:18754
Definition: VehicleDefines.h:130
Definition: MoveSpline.h:27
float orientation
Definition: MoveSpline.h:33
Location ComputePosition() const
Definition: MoveSpline.cpp:26
bool onTransport
Definition: MoveSpline.h:127

References Movement::MoveSpline::ComputePosition(), GetDirectTransport(), Object::IsPlayer(), WorldObject::m_movementInfo, Position::m_positionX, Position::m_positionY, Position::m_positionZ, movespline, Movement::MoveSpline::onTransport, Movement::Location::orientation, MovementInfo::TransportInfo::pos, Position::SetOrientation(), Creature::SetPosition(), Object::ToCreature(), MovementInfo::transport, and UpdatePosition().

Referenced by StopMoving(), and UpdateSplineMovement().

◆ UpdateStats()

virtual bool Unit::UpdateStats ( Stats  stat)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ Whisper() [1/2]

void Unit::Whisper ( std::string_view  text,
Language  language,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21142{
21143 if (!target)
21144 {
21145 return;
21146 }
21147
21149 WorldPacket data;
21150 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale);
21151 target->SendDirectMessage(&data);
21152}
LocaleConstant
Definition: Common.h:65
@ CHAT_MSG_MONSTER_WHISPER
Definition: SharedDefines.h:3167
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition: SharedDefines.h:3194
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition: Chat.cpp:264
LocaleConstant GetSessionDbLocaleIndex() const
Definition: WorldSession.h:498

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), and Player::SendDirectMessage().

Referenced by npc_commandscript::HandleNpcWhisperCommand(), Map::ScriptsProcess(), and boss_zuramat::boss_zuramatAI::UpdateAI().

◆ Whisper() [2/2]

void Unit::Whisper ( uint32  textId,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21200{
21201 if (!target)
21202 {
21203 return;
21204 }
21205
21206 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
21207 if (!bct)
21208 {
21209 LOG_ERROR("entities.unit", "Unit::Whisper: `broadcast_text` was not {} found", textId);
21210 return;
21211 }
21212
21214 WorldPacket data;
21215 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
21216 target->SendDirectMessage(&data);
21217}
Definition: ObjectMgr.h:433
std::string const & GetText(LocaleConstant locale=DEFAULT_LOCALE, uint8 gender=GENDER_MALE, bool forceGender=false) const
Definition: ObjectMgr.h:455

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, getGender(), Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), BroadcastText::GetText(), LANG_UNIVERSAL, LOG_ERROR, Player::SendDirectMessage(), and sObjectMgr.

◆ Yell() [1/2]

void Unit::Yell ( std::string_view  text,
Language  language,
WorldObject const *  target = nullptr 
)
virtual

◆ Yell() [2/2]

void Unit::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21190{
21191 Talk(textId, CHAT_MSG_MONSTER_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
21192}

References CHAT_MSG_MONSTER_YELL, CONFIG_LISTEN_RANGE_YELL, and sWorld.

Member Data Documentation

◆ _charmThreatInfo

CharmThreatMap Unit::_charmThreatInfo
protected

Referenced by RemoveCharmedBy().

◆ _instantCast

bool Unit::_instantCast
protected

◆ _isWalkingBeforeCharm

bool Unit::_isWalkingBeforeCharm
private

Are we walking before we were charmed?

Referenced by SetCharm(), and Unit().

◆ _lastDamagedTargetGuid

◆ _lastExtraAttackSpell

uint32 Unit::_lastExtraAttackSpell
private

◆ _lastLiquid

LiquidTypeEntry const* Unit::_lastLiquid
protected

◆ _oldFactionId

uint32 Unit::_oldFactionId
private

faction before charm

Referenced by GetOldFactionId(), RemoveCharmedBy(), SetCharmedBy(), and Unit().

◆ _redirectThreatInfo

◆ _valuesUpdateCache

ValuesUpdateCache Unit::_valuesUpdateCache
private

◆ bRequestForcedVisibilityUpdate

◆ extraAttacksTargets

std::unordered_map<ObjectGuid , uint32 > Unit::extraAttacksTargets
private

Referenced by AddExtraAttacks(), and Update().

◆ i_AI

◆ i_disabledAI

UnitAI* Unit::i_disabledAI
protected

Referenced by UpdateCharmAI().

◆ i_motionMaster

MotionMaster* Unit::i_motionMaster
protected

Referenced by GetMotionMaster(), and ~Unit().

◆ IsAIEnabled

◆ m_appliedAuras

◆ m_applyResilience

bool Unit::m_applyResilience
protected

◆ m_attackers

◆ m_attacking

Unit* Unit::m_attacking
protected

◆ m_attackTimer

◆ m_auraModifiersGroup

◆ m_auraStateAuras

◆ m_auraUpdateIterator

AuraMap::iterator Unit::m_auraUpdateIterator
protected

◆ m_AutoRepeatFirstCast

bool Unit::m_AutoRepeatFirstCast
protected

◆ m_baseSpellCritChance

◆ m_canDualWield

bool Unit::m_canDualWield

◆ m_canModifyStats

bool Unit::m_canModifyStats
protected

◆ m_charmInfo

◆ m_cleanupDone

bool Unit::m_cleanupDone
private

◆ m_CombatTimer

uint32 Unit::m_CombatTimer
private

◆ m_ComboPointHolders

std::unordered_set<Unit*> Unit::m_ComboPointHolders
private

◆ m_comboPoints

int8 Unit::m_comboPoints
private

◆ m_comboTarget

◆ m_Controlled

◆ m_ControlledByPlayer

bool Unit::m_ControlledByPlayer

◆ m_CreatedByPlayer

bool Unit::m_CreatedByPlayer

◆ m_createStats

float Unit::m_createStats[MAX_STATS]
protected

◆ m_currentSpells

◆ m_deathState

◆ m_delayed_unit_ai_notify_timer

uint16 Unit::m_delayed_unit_ai_notify_timer

Referenced by Unit(), and Update().

◆ m_delayed_unit_relocation_timer

uint16 Unit::m_delayed_unit_relocation_timer

Referenced by Unit(), Player::Update(), and Update().

◆ m_Diminishing

◆ m_duringRemoveFromWorld

bool Unit::m_duringRemoveFromWorld
private

◆ m_dynObj

◆ m_Events

EventProcessor Unit::m_Events

Referenced by _ExitVehicle(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Activate(), CharmInfo::AddSpellToActionBar(), Spell::AddUnitTarget(), spell_sindragosa_ice_tomb_trap_aura::AfterApply(), Creature::CallAssistance(), boss_high_nethermancer_zerevor::CastDampenMagicIfPossible(), CastDelayedSpellWithPeriodicAmount(), boss_murmur::CastSuppressionOOC(), CleanupBeforeRemoveFromMap(), boss_romulo::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), boss_julianne::DoAction(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::DoAction(), boss_cthun::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_maiev_illidan::DoAction(), npc_blade_of_azzinoth::DoAction(), boss_ouro::Emerge(), boss_illidan_stormrage::EnterEvadeMode(), SpellEvent::Execute(), BattleExperienceEvent::Execute(), UtherBatteredHiltEvent::Execute(), TriggerWickedSpirit::Execute(), lapseTeleport::Execute(), PartyTimeEmoteEvent::Execute(), npc_xt002_boombot::npc_xt002_boombotAI::Explode(), Creature::ForcedDespawn(), WorldSession::HandleAuctionListOwnerItems(), spell_item_party_time::HandleEffectApply(), spell_alar_flame_quills::HandlePeriodic(), WorldSession::HandlePlayerLoginFromDB(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), boss_ambassador_hellmaw::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Totem::InitSummon(), npc_blade_of_azzinoth::IsSummonedBy(), npc_flame_of_azzinoth::IsSummonedBy(), npc_maiev_illidan::IsSummonedBy(), npc_swarm_scarab::npc_swarm_scarabAI::JustDied(), npc_nerubian_burrower::npc_nerubian_burrowerAI::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), npc_xt002_boombot::npc_xt002_boombotAI::JustDied(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::JustDied(), boss_mother_shahraz::JustDied(), boss_najentus::JustDied(), npc_flame_of_azzinoth::JustEngagedWith(), boss_essence_of_suffering::boss_essence_of_sufferingAI::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_murmur::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_illidan_stormrage::JustEngagedWith(), boss_mother_shahraz::JustEngagedWith(), boss_najentus::JustEngagedWith(), boss_hydross_the_unstable::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), boss_kiljaeden::boss_kiljaedenAI::JustSummoned(), boss_hazzarah::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_prince_valanar_icc::boss_prince_valanarAI::JustSummoned(), boss_sindragosa::boss_sindragosaAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::JustSummoned(), npc_risen_archmage::npc_risen_archmageAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::JustSummoned(), boss_gurtogg_bloodboil::KilledUnit(), boss_illidan_stormrage::KilledUnit(), boss_essence_of_suffering::boss_essence_of_sufferingAI::KilledUnit(), boss_essence_of_desire::boss_essence_of_desireAI::KilledUnit(), boss_essence_of_anger::boss_essence_of_angerAI::KilledUnit(), Creature::ModifyThreatPercentTemp(), boss_ebonroc::boss_ebonrocAI::MovementInform(), boss_captain_skarloc::MovementInform(), boss_ayamiss::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_akama_illidan::MovementInform(), boss_essence_of_suffering::boss_essence_of_sufferingAI::MovementInform(), boss_essence_of_desire::boss_essence_of_desireAI::MovementInform(), npc_kalecgos::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), boss_ghazan::MovementInform(), spell_halion_twilight_realm_aura::OnApply(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), go_main_chambers_access_panel::OnGossipHello(), spell_halion_leave_twilight_realm_aura::OnRemove(), at_cthun_stomach_exit::OnTrigger(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnUnitDeath(), npc_hyldsmeet_protodrake::npc_hyldsmeet_protodrakeAI::PassengerBoarded(), boss_anetheron::PathEndReached(), boss_rage_winterchill::PathEndReached(), npc_hyjal_ground_trash::PathEndReached(), npc_hyjal_frost_wyrm::PathEndReached(), boss_ambassador_hellmaw::PathEndReached(), npc_akama_illidan::PathEndReached(), npc_hyjal_gargoyle::PathEndReached(), npc_hive_zara_swarmer::PathEndReached(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), Spell::prepare(), SmartScript::ProcessAction(), Spell::RecalculateDelayMomentForDst(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::Reset(), boss_illidan_stormrage::Reset(), npc_akama_illidan::Reset(), npc_maiev_illidan::Reset(), boss_mother_shahraz::Reset(), boss_najentus::Reset(), NPCStaveQuestAI::ResetState(), boss_illidan_stormrage::ScheduleAbilities(), npc_gunship_boarding_addAI::SetData(), boss_the_beast::boss_thebeastAI::SetData(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::SummonedCreatureDies(), boss_hydross_the_unstable::SummonMovementInform(), boss_hydross_the_unstable::SummonTaintedElementalOOC(), CreatureAI::Talk(), TempSummon::UnSummon(), Totem::UnSummon(), spell_illidari_council_deadly_strike_aura::Update(), Update(), boss_felmyst::boss_felmystAI::UpdateAI(), and boss_anomalus::boss_anomalusAI::UpdateAI().

◆ m_extraAttacks

uint32 Unit::m_extraAttacks

◆ m_FollowingRefMgr

FollowerRefMgr Unit::m_FollowingRefMgr
private

Referenced by addFollower().

◆ m_gameObj

◆ m_HostileRefMgr

HostileRefMgr Unit::m_HostileRefMgr
private

◆ m_interruptableAuras

◆ m_interruptMask

◆ m_last_notify_mstime

uint32 Unit::m_last_notify_mstime

◆ m_last_notify_position

◆ m_lastManaUse

uint32 Unit::m_lastManaUse
private

◆ m_lastSanctuaryTime

uint32 Unit::m_lastSanctuaryTime

◆ m_modAttackSpeedPct

◆ m_modAuras

◆ m_modMeleeHitChance

◆ m_modRangedHitChance

◆ m_modSpellHitChance

◆ m_movedByPlayer

◆ m_ObjectSlot

◆ m_ownedAuras

◆ m_petAuras

PetAuraSet Unit::m_petAuras

◆ m_procDeep

int32 Unit::m_procDeep
protected

Referenced by CanProc(), and SetCantProc().

◆ m_race

uint8 Unit::m_race
protected

◆ m_reactiveTimer

uint32 Unit::m_reactiveTimer[MAX_REACTIVE]
protected

◆ m_realRace

uint8 Unit::m_realRace
protected

◆ m_regenTimer

◆ m_removedAuras

AuraList Unit::m_removedAuras
protected

◆ m_removedAurasCount

uint32 Unit::m_removedAurasCount
protected

◆ m_rootTimes

uint32 Unit::m_rootTimes
protected

Referenced by SetRooted(), and Unit().

◆ m_scAuras

AuraList Unit::m_scAuras
protected

Referenced by GetSingleCastAuras().

◆ m_sharedVision

◆ m_speed_rate

float Unit::m_speed_rate[MAX_MOVE_TYPE]
protected

◆ m_spellImmune

◆ m_state

uint32 Unit::m_state
private

◆ m_SummonSlot

◆ m_ThreatMgr

◆ m_threatModifier

float Unit::m_threatModifier[MAX_SPELL_SCHOOL]

◆ m_transform

uint32 Unit::m_transform
protected

Referenced by getTransForm(), setTransForm(), and Unit().

◆ m_unitTypeMask

◆ m_vehicle

◆ m_vehicleKit

Vehicle* Unit::m_vehicleKit
protected

◆ m_visibleAuras

◆ m_weaponDamage

◆ movespline

◆ NeedChangeAI

bool Unit::NeedChangeAI

◆ SafeUnitPointerSet

std::set<SafeUnitPointer*> Unit::SafeUnitPointerSet